嗨,我想将spark数据帧保存到具有自定义文件格式的文件中, 这样,在写入文件时会将数据分区到其他文件。 另外,每个分区键都需要一个零件文件。
我尝试扩展TextBasedFileFormat并更改writer以适应我的需求。 写入文件时,数据将进行分区,而不会随机播放。 但是我感觉每个rdd分区都会将数据写入不同的零件文件
答案 0 :(得分:1)
写入数据帧时,基础RDD的每个分区将由单独的任务写入。现在,这些RDD分区中的每个分区都可能对应于属于不同分区键的数据。因此,每个任务最终都会创建多个零件文件。
要解决此问题,必须通过partitionKey重新划分数据帧。这将涉及洗牌,并且与同一个partitionKey对应的所有数据都将进入同一个RDD分区。可以通过-
val newDf = df.repartition("partitionKey")
现在此RDD可以写入任何文件格式(例如镶木地板,csv等),并且每个分区应为1个文件。如果文件太大,则可能会创建多个文件。可以通过配置“ spark.sql.files.maxRecordsPerFile”来控制。
val newDf = df.repartition("partitionKey")
newDf.write.partitionBy("partitionKey").parquet("<directory_path>")