如何在pyspark中并行编写多个parquet文件?

2024-05-04 13:49:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将数据帧拆分为两个数据帧,然后将它们写入两个单独的拼花文件中,如下所示

df = attachment_df.flatMap(process_attachment).toDF()

large_df = df.filter(df.is_large_file == True)
small_df = df.filter(df.is_large_file == False)

(large_df.write
    .mode("overwrite")
    .parquet('large_dummy'))

(small_df.write
    .mode("overwrite")
    .parquet('small_dummy'))

但是,上面的代码将按顺序编写,看起来每个附件都会调用process_attachment函数两次。我真的想避免重复计算,因为处理一个附件是非常昂贵的。在

有没有办法避免附件的重复处理和并行写?我不想使用分区by is_large_file column写入单个拼花文件。在

谢谢


Tags: 文件数据df附件attachmentismodefilter
1条回答
网友
1楼 · 发布于 2024-05-04 13:49:23

当spark写入时,它对每个数据帧并行写入(基于分区数)。所以你基本上是连续地做两个平行的任务(也就是说,这不会有太大的效果)。 主要的问题是目前你要重新计算df两次。在

原因是DAG是为每个操作单独计算的(写入是一个操作)。在

如果你有足够的记忆,你可以通过做数据仓库缓存()在第一次写入之前反持久主义者在第二次写作之后。这将在可能的情况下(即内存足够),将df的计算保存在内存中。在

如果您没有足够的内存,并且进程附件非常长,您可以尝试使用persist with memory_and_DISK选项,如果该选项太大,会将计算溢出到磁盘(即,您将从磁盘重新加载,而不是重新计算)。在

相关问题 更多 >