繁体   English   中英

如何在SPARK数据框创建的文件夹中合并所有零件文件并在Scala中将其重命名为文件夹名称

[英]How to merge all part files in a folder created by SPARK data frame and rename as folder name in scala

嗨,我有spark数据框的输出,该数据框创建了文件夹结构,并可能创建了零件文件。 现在,我必须合并文件夹中的所有零件文件,并将该文件重命名为文件夹路径名。

这是我做分区的方法

df.write.partitionBy("DataPartition","PartitionYear")
  .format("csv")
  .option("nullValue", "")
  .option("header", "true")/
  .option("codec", "gzip")
  .save("hdfs:///user/zeppelin/FinancialLineItem/output")

它创建这样的文件夹结构

hdfs:///user/zeppelin/FinancialLineItem/output/DataPartition=Japan/PartitionYear=1971/part-00001-87a61115-92c9-4926-a803-b46315e55a08.c000.csv.gz
hdfs:///user/zeppelin/FinancialLineItem/output/DataPartition=Japan/PartitionYear=1971/part-00002-87a61115-92c9-4926-a803-b46315e55a08.c001.csv.gz

我必须像这样创建最终文件

hdfs:///user/zeppelin/FinancialLineItem/output/Japan.1971.currenttime.csv.gz

此处位001和002的任何零件文件都未合并为两个。

我的数据大小非常大,有300 GB gzip和35 GB的压缩文件,所以coalesce(1) and repartition速度非常慢。

我在这里看到一种解决方案, 使用spark-csv编写单个CSV文件,但是我无法实现它,请帮助我。

分区抛出错误

error: value repartition is not a member of org.apache.spark.sql.DataFrameWriter[org.apache.spark.sql.Row]
       dfMainOutputFinalWithoutNull.write.repartition("DataPartition","StatementTypeCode")

从Spark外部的头节点尝试...

hdfs dfs -getmerge <src> <localdst>

https://hadoop.apache.org/docs/r1.2.1/file_system_shell.html#getmerge

“将源目录和目标文件作为输入,并将src中的文件连接到目标本地文件中。可以选择将addnl设置为启用,以在每个文件的末尾添加换行符。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM