在文件名中访问df.write.partition的值并保存时执行转换

时间:2019-03-29 21:56:05

标签: scala apache-spark

我正在做

df.write.mode("overwrite").partitionBy("sourcefilename").format("orc").save("s3a://my/dir/path/output-data");

以上代码确实在分区目录中成功生成了orc文件名,但是命名类似于part-0000。

我需要在保存例如通过(sourcefilename)值更改分区如果源文件名是ABC,则分区目录(在写操作时将创建)应该是123,如果DEF是345,依此类推。

我们如何满足以上要求?我正在使用AWS S3读写文件。

我正在使用Spark 2.x和Scala 2.11。

2 个答案:

答案 0 :(得分:1)

鉴于此示例显示了DF Writer常规

df.write.partitionBy("EVENT_NAME","dt","hour").save("/apps/hive/warehouse/db/sample")

format,那么您的方法应该是创建一个额外的列xc,该列由UDF设置,或者由一些def或val来根据名称设置xc,例如ABC-> 123,等等。然后按此xc col进行分区,并接受part-xxxxx就是它在Spark中的工作方式。

然后您可以随后自己通过脚本重命名文件。

答案 1 :(得分:0)

part-1234样式是工作的分区方式:不同的任务获得拆分数据源的自己的分区,并用编号保存,以确保其他任务不会产生相同名称的输出。

这是获得并行执行性能的基础。