Я экспериментировал с разными способами фильтрации набора типизированных данных. Оказывается, производительность может быть совсем другой.
Набор данных был создан на основе строк данных размером 1,6 ГБ с 33 столбцами и 4226047 строками. DataSet создается путем загрузки данных CSV и сопоставляется с классом дела.
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 987 мс, т.е. в 30 раз медленнее)
df.filter(_.UnitID.orNull == "B02").count()
Я снова протестировал его с помощью API Python, для того же набора данных время составляет 17 046 мс, что сопоставимо с производительностью варианта 3 API Scala.
df.filter(df['UnitID'] == 'B02').count()
Может ли кто-нибудь пролить свет на то, как 3) и API Python выполняются иначе, чем первые два варианта?