我正在尝试使用 bucketing 技术对Spark作业进行一些性能优化。我正在读取.parquet
和.csv
文件并进行一些转换。完成存储并加入两个DataFrame之后。然后,我将加入DF写入镶木地板,但是我有一个~500B
而不是500Mb
的空文件。
斑点
val readParquet = spark.read.parquet(inputP)
readParquet
.write
.format("parquet")
.bucketBy(23, "column")
.sortBy("column")
.mode(SaveMode.Overwrite)
.saveAsTable("bucketedTable1")
val firstTableDF = spark.table("bucketedTable1")
val readCSV = spark.read.csv(inputCSV)
readCSV
.filter(..)
.ordrerBy(someColumn)
.write
.format("parquet")
.bucketBy(23, "column")
.sortBy("column")
.mode(SaveMode.Overwrite)
.saveAsTable("bucketedTable2")
val secondTableDF = spark.table("bucketedTable2")
val resultDF = secondTableDF
.join(firstTableDF, Seq("column"), "fullouter")
.
.
resultDF
.coalesce(1)
.write
.mode(SaveMode.Overwrite)
.parquet(output)
当我使用ssh
在命令行中启动Spark作业时,我得到了正确的结果,~500Mb
拼花文件,使用Hive可以看到。如果我使用oozie工作流程运行相同的作业,则我有一个空文件(~500 Bytes
)。
当我在.show()
上执行resultDF
时,可以看到数据,但我的镶木地板文件为空。
+-----------+---------------+----------+
| col1| col2 | col3|
+-----------+---------------+----------+
|33601234567|208012345678910| LOL|
|33601234567|208012345678910| LOL|
|33601234567|208012345678910| LOL|
当我不将数据保存为表格时,写入镶木地板没有问题。仅在从表创建的DF中发生。
有什么建议吗?
预先感谢您的任何想法!
答案 0 :(得分:1)
我为我的情况弄清楚了,我只是添加了一个选项.option("path", "/sources/tmp_files_path")
。现在,我可以使用存储桶,并且我的输出文件中有数据。
readParquet
.write
.option("path", "/sources/tmp_files_path")
.mode(SaveMode.Overwrite)
.bucketBy(23, "column")
.sortBy("column")
.saveAsTable("bucketedTable1")