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

时间:2017-10-18 14:17:56

标签: scala apache-spark hdfs spark-dataframe hadoop2

您好我的火花数据框的输出创建了文件夹结构并创建了部分文件。 现在我必须合并文件夹中的所有零件文件,并将该文件重命名为文件夹路径名。

这就是我的分区方式

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

这里没有零件文件bith 001和002合二为一。

我的数据大小非常大300 GB gzip和35 GB压缩,因此coalesce(1) and repartition变得非常慢。

我在这里看到了一个解决方案 Write single CSV file using spark-csv但我无法实施,请帮助我。

重新分配投掷错误

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

1 个答案:

答案 0 :(得分:0)

从Spark ...之外的头节点试试这个......

hdfs dfs -getmerge <src> <localdst>

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

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