Есть несколько сценариев, в которых я считаю, что Dataframe (или Dataset [Row]) более полезен, чем типизированный набор данных.
Например, когда я потребляю данные без фиксированной схемы, напримерJSON-файлы, содержащие записи разных типов с разными полями.Используя Dataframe, я могу легко «выбрать» нужные мне поля, не зная всей схемы, или даже использовать конфигурацию времени выполнения, чтобы указать поля, к которым я получу доступ.
Другое соображение заключается в том, что Spark может лучшеоптимизировать встроенные в Spark SQL операции и агрегаты, чем UDAF и пользовательские лямбды.Поэтому, если вы хотите получить квадратный корень из значения в столбце, это встроенная функция (df.withColumn("rootX", sqrt("X"))
) в Spark SQL, но выполнение в лямбде (ds.map(X => Math.sqrt(X))
) будет менее эффективным, поскольку Spark не можетоптимизировать вашу лямбда-функцию так же эффективно.
Существует также множество нетипизированных функций Dataframe (например, статистических функций), которые реализованы для Dataframes, но не для типизированных наборов данных, и вы часто обнаружите, что даже если вы начинаете с набора данных, к тому времени, как выЗакончив агрегирование, вы остаетесь с Dataframe, потому что функции работают путем создания новых столбцов, изменения схемы вашего набора данных.
В общем, я не думаю, что вам следует переходить с рабочего кода Dataframe на типизированные наборы данных, если толькоу тебя есть веская причина.Многие функции набора данных по-прежнему помечены как «экспериментальные» в Spark 2.4.0, и, как уже упоминалось выше, не все функции Dataframe имеют эквиваленты набора данных.