Чтобы воспользоваться преимуществами оптимизаций Dataset
«s, у меня явно использовать Dataframe's
метод (например, df.select(col("name"), col("age")
и т.д.) или позвонив по телефону любых методов набора данных - даже РДД-подобные методам (например, filter
, map
, и т. д.) также позволит оптимизировать?Должен ли я явно использовать методы Dataframe, чтобы воспользоваться оптимизацией Dataset?
ответ
оптимизация Dataframe приходит в целом в 3-х вариантах:
- управление памятью Вольфрам оптимизация запросов
- wholestage Codegen управления памятью
- Catalyst
вольфрама
При определенииRDD [myclass], искра не имеет реального понимания того, что такое myclass. Это означает, что в целом каждая строка будет содержать экземпляр класса.
У этой проблемы есть две проблемы.
Первый - это размер объекта. У объекта java есть накладные расходы. Например, класс case, который содержит два простых целых числа. Выполнение последовательности из 1000000 экземпляров и превращение ее в RDD займет ~ 26 МБ, а то же, что и в наборе данных/dataframe, будет ~ 2 МБ.
Кроме того, эта память, когда она выполняется в наборе данных/dataframe, не управляется сборкой мусора (она управляется как небезопасная память внутри от искры) и поэтому будет иметь меньшие накладные расходы при работе GC.
Dataset обладает теми же преимуществами управления памятью данных. При этом при выполнении операций набора данных преобразование данных из внутренней (Row) структуры данных в класс case имеет накладные расходы.
оптимизации Catalyst запрос
При использовании dataframes функции, искра знает, что вы пытаетесь сделать, и иногда может изменить ваш запрос к эквивалентной той, которая является более эффективным.
Предположим, например, что вы делаете что-то вроде: df.withColumn ("a", lit (1)). Filter ($ "b" < ($ "a" + 1)).
В основном вы проверяете, есть ли (x < 1 + 1). Spark достаточно умен, чтобы понять это и изменить его на x < 2.
Эти операции не могут быть выполнены при использовании операций набора данных, поскольку искра не имеет представления о внутренних функциях, которые вы выполняете.
wholestage Codegen
Когда искра знает, что вы делаете это на самом деле может генерировать более эффективный код. В некоторых случаях это может повысить производительность в 10 раз.
Это также не может быть сделано для функций набора данных, поскольку искра не знает внутренних функций.