我写了一个简单的程序,要求一个庞大的数据库。为了导出结果,我编写了以下函数:
result.coalesce(1).write.options(Map("header" -> "true", "delimiter" > ";")).csv(mycsv.csv)
我使用coalesce
方法仅获得一个文件作为输出。问题在于结果文件包含超过一百万行。所以,我无法在Excel中打开它...
因此,我考虑使用一种方法(或使用for循环编写我自己的函数),该方法可以创建与文件中的行数相关的分区。但是我不知道该怎么办。
我的想法是,如果我的行数少于一百万,则将有一个分区。如果我有超过一百万个=>两个分区,则有200万=> 3个分区,依此类推。
有可能做这样的事情吗?
答案 0 :(得分:4)
您可以根据数据框中的行数来更改分区数。
例如:
val rowsPerPartition = 1000000
val partitions = (1 + df.count() / rowsPerPartition).toInt
val df2 = df.repartition(numPartitions=partitions)
然后像以前一样将新数据帧写入csv文件。
注意:可能需要使用repartition
而不是coalesce
来确保每个分区中的行数大致相等,请参见Spark - repartition() vs coalesce() 。