我想将数据帧拆分为两个数据帧,然后将它们写入两个单独的拼花文件中,如下所示
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写入单个拼花文件。在
谢谢
当spark写入时,它对每个数据帧并行写入(基于分区数)。所以你基本上是连续地做两个平行的任务(也就是说,这不会有太大的效果)。 主要的问题是目前你要重新计算df两次。在
原因是DAG是为每个操作单独计算的(写入是一个操作)。在
如果你有足够的记忆,你可以通过做数据仓库缓存()在第一次写入之前反持久主义者在第二次写作之后。这将在可能的情况下(即内存足够),将df的计算保存在内存中。在
如果您没有足够的内存,并且进程附件非常长,您可以尝试使用persist with memory_and_DISK选项,如果该选项太大,会将计算溢出到磁盘(即,您将从磁盘重新加载,而不是重新计算)。在
相关问题 更多 >
编程相关推荐