将 DataFrame 编写为镶木地板会创建空文件
Writing DataFrame as parquet creates empty files
我正在尝试使用 bucketing 技术对 Spark 作业进行一些性能优化。我正在阅读 .parquet
和 .csv
文件并进行一些转换。在我进行分桶并加入两个 DataFrame 之后。然后我正在将 joined DF 写入镶木地板,但我有一个空文件 ~500B
而不是 500Mb
.
- Cloudera (cdh5.15.1)
- 星火 2.3.0
斑点
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
)。
当我在 resultDF
上执行 .show()
时,我可以看到数据,但我的镶木地板文件是空的。
+-----------+---------------+----------+
| col1| col2 | col3|
+-----------+---------------+----------+
|33601234567|208012345678910| LOL|
|33601234567|208012345678910| LOL|
|33601234567|208012345678910| LOL|
当我没有将数据保存为 table 时,写入 parquet 没有问题。它仅发生在从 table.
创建的 DF 中
有什么建议吗?
提前感谢您的任何想法!
我想出了我的案例,我只是添加了一个选项 .option("path", "/sources/tmp_files_path")
。现在我可以使用分桶并且我的输出文件中有数据。
readParquet
.write
.option("path", "/sources/tmp_files_path")
.mode(SaveMode.Overwrite)
.bucketBy(23, "column")
.sortBy("column")
.saveAsTable("bucketedTable1")
我正在尝试使用 bucketing 技术对 Spark 作业进行一些性能优化。我正在阅读 .parquet
和 .csv
文件并进行一些转换。在我进行分桶并加入两个 DataFrame 之后。然后我正在将 joined DF 写入镶木地板,但我有一个空文件 ~500B
而不是 500Mb
.
- Cloudera (cdh5.15.1)
- 星火 2.3.0
斑点
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
)。
当我在 resultDF
上执行 .show()
时,我可以看到数据,但我的镶木地板文件是空的。
+-----------+---------------+----------+
| col1| col2 | col3|
+-----------+---------------+----------+
|33601234567|208012345678910| LOL|
|33601234567|208012345678910| LOL|
|33601234567|208012345678910| LOL|
当我没有将数据保存为 table 时,写入 parquet 没有问题。它仅发生在从 table.
创建的 DF 中有什么建议吗?
提前感谢您的任何想法!
我想出了我的案例,我只是添加了一个选项 .option("path", "/sources/tmp_files_path")
。现在我可以使用分桶并且我的输出文件中有数据。
readParquet
.write
.option("path", "/sources/tmp_files_path")
.mode(SaveMode.Overwrite)
.bucketBy(23, "column")
.sortBy("column")
.saveAsTable("bucketedTable1")