У меня есть операция в искровом свете, которая должна выполняться для нескольких столбцов в кадре данных. Как правило, есть 2 возможности указать такие операцииSpark динамический DAG намного медленнее и отличается от жестко закодированного DAG
- жёстко
handleBias("bar", df)
.join(handleBias("baz", df), df.columns)
.drop(columnsToDrop: _*).show
- динамически генерировать их из списка COLNAMES
var isFirst = true
var res = df
for (col <- columnsToDrop ++ columnsToCode) {
if (isFirst) {
res = handleBias(col, res)
isFirst = false
} else {
res = handleBias(col, res)
}
}
res.drop(columnsToDrop: _*).show
Проблема заключается в том, что DAG, генерируемый динамически, отличается и время выполнения dy namic решение увеличивается гораздо больше, когда используется больше столбцов, чем для жестко закодированных операций.
Мне любопытно, как сочетать элегантность динамичной конструкции с быстрым временем выполнения.
Вот сравнение для групп DAG в примере кода
Для около 80 столбцов это приводит к довольно хороший графике для жесткого кодировкой варианта И очень большой, вероятно, менее параллелизуемое и медленной DAG для динамически построенного запроса.
Текущая версия искры (2.0.2) использовали с DataFrames
и искровым SQL
код завершить минимальный пример:
def handleBias(col: String, df: DataFrame, target: String = "FOO"): DataFrame = {
val pre1_1 = df
.filter(df(target) === 1)
.groupBy(col, target)
.agg((count("*")/df.filter(df(target) === 1).count).alias("pre_" + col))
.drop(target)
val pre2_1 = df
.groupBy(col)
.agg(mean(target).alias("pre2_" + col))
df
.join(pre1_1, Seq(col), "left")
.join(pre2_1, Seq(col), "left")
.na.fill(0)
}
редактировать
Запуск задачи с foldleft
генерирует линейный DAG и жесткое кодирование функции для всех результатов столбцов в
Оба намного лучше, чем мои оригинальные DAG, но, тем не менее, жесткий код выглядит лучше для меня. Строка, объединяющая инструкцию SQL в искровом режиме, может позволить мне динамически генерировать граф с жестким кодированием, но это кажется довольно уродливым. Вы видите другой вариант?
Я думаю, что проблема в том, что ваша функция «handleBias» очень сложна, и вам нужно запустить ее для нескольких столбцов. Даже если вы сделаете это жестко запрограммированным для многих столбцов, ваша DAG будет большой, поэтому, возможно, проблема не применяется «динамически», а применяется ко многим столбцам. Итак, если вы можете придумать способ адаптировать свою функцию для обработки нескольких столбцов одновременно, это может значительно помочь. –
@ DanieldePaula Вы видите какой-либо способ выразить этот метод более простым способом, чтобы требовалось меньше вычислительной мощности? –
К сожалению, у меня нет много времени, чтобы подумать об этом прямо сейчас, извините. Если завтра вы не найдете решения, я посмотрю на него. –