Оптимизированный способ накопления суммы на большом количестве столбцов в pyspark - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть DataFrame, содержащий 752 (идентификатор, дата и 750 столбцов объектов) и около 1,5 миллионов строк, и мне нужно применить накопительную сумму ко всем 750 столбцам объектов, разделенных по идентификатору и порядку по дате.

Ниже представлен подход, которому я следую в настоящее время:

# putting all 750 feature columns in a list
required_columns = ['ts_1','ts_2'....,'ts_750']

# defining window
sumwindow = Window.partitionBy('id').orderBy('date')

# Applying window to calculate cumulative of each individual feature column

for current_col in required_columns:
    new_col_name = "sum_{0}".format(current_col)
    df=df.withColumn(new_col_name,sum(col(current_col)).over(sumwindow))

# Saving the result into parquet file    
df.write.format('parquet').save(output_path)

Я получаю ошибку ниже при выполнении этого текущего подхода

py4j.protocol.Py4JJavaError: An error occurred while calling o2428.save.
: java.lang.StackOverflowError

Пожалуйстадайте мне знать альтернативное решение для того же.кажется, что накопленная сумма немного сложна с большим количеством данных.Пожалуйста, предложите любой альтернативный подход или любые конфигурации искры, которые я могу настроить, чтобы он работал.

1 Ответ

0 голосов
/ 19 декабря 2018

Я полагаю, у вас проблема слишком большой линии.Взгляните на свой план объяснения после того, как вы повторно назначаете фрейм данных так много раз.

Стандартное решение для этого - периодически проверять ваш фрейм данных, чтобы урезать план объяснения.Это похоже на кэширование, но для плана, а не для данных, и часто требуется для итеративных алгоритмов, которые модифицируют кадры данных.

Здесь - это хорошее объяснение pyspark кэширования и контрольных точек

Я предлагаю df.checkpoint () каждые 5-10 модификаций, чтобы начать с

Позвольтемы знаем, как это происходит

...