Я экспериментировал с различными способами фильтрации типизированного набора данных. Оказывается, производительность может быть совсем другой.Производительность фильтра Spark DataSet
Набор данных был создан на основе рядов данных объемом 1,6 ГБ с 33 столбцами и 4226047 строк. DataSet создается путем загрузки данных csv и сопоставления с классом case.
val df = spark.read.csv(csvFile).as[FireIncident]
Фильтр на UnitId = 'B02' должен возвращать 47980 строк. Я проверил три способа, как показано ниже: 1) Использование напечатал колонку (~ 500 мс на локальном хосте)
df.where($"UnitID" === "B02").count()
2) Используйте временную таблицу и SQL-запрос (~ так же, как вариант 1)
df.createOrReplaceTempView("FireIncidentsSF")
spark.sql("SELECT * FROM FireIncidentsSF WHERE UnitID='B02'").count()
3) Используйте сильное поле класса типизированного (14,987ms, то есть в 30 раз, как медленные)
df.filter(_.UnitID.orNull == "B02").count()
Я проверил его снова с Python API, для того же набора данных, выбор времени 17,046 мс, сравнимые с выполнением API scala вариант 3.
df.filter(df['UnitID'] == 'B02').count()
Может кто-нибудь пролить некоторый свет на 3) и Python API выполняются по-разному из первых двух вариантов?
API-интерфейс API Python и Scala API с сильным типизированным полем класса имеют сопоставимые результаты. Знаете ли вы, почему опция 3) на 30 раз медленнее, чем 1) или 2)? – YPL