Итеративное объединение нескольких фреймов данных в PySpark - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь объединить несколько фреймов данных с помощью функции 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, у меня слишком много задач для написания паркета. Хотя моя цель - написать ОДИН большой кадр данных, он на самом деле записывает все подкадры данных.

Есть предположения?

1 Ответ

0 голосов
/ 17 мая 2019

Спарк лениво оценивается. Операция write - это действие, которое запускает все предыдущие преобразования. Поэтому эти задачи предназначены для этих преобразований, а не только для написания паркетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...