Я пытаюсь объединить несколько фреймов данных с помощью функции unionAll
в pyspark.
Вот что я делаю:
df_list = []
for i in range(something):
normalizer = Normalizer(inputCol="features", outputCol="norm", p=1)
norm_df = normalizer.transform(some_df)
norm_df = norm_df.repartition(320)
data = index_df(norm_df)
data.persist()
mat = IndexedRowMatrix(
data.select("id", "norm")\
.rdd.map(lambda row: IndexedRow(row.id, row.norm.toArray()))).toBlockMatrix()
dot = mat.multiply(mat.transpose())
df = dot.toIndexedRowMatrix().rows.toDF()
df_list.append(df)
big_df = reduce(unionAll, df_list)
big_df.write.mode('append').parquet('some_path')
Я хочу сделать это, потому что запись занимает много времени, и поэтому в моем случае записать один большой файл намного быстрее, чем n маленьких файлов.
Проблема в том, что когда я пишу big_df
и проверяю Spark UI, у меня слишком много задач для написания паркета. Хотя моя цель - написать ОДИН большой кадр данных, он на самом деле записывает все подкадры данных.
Есть предположения?