将DataFrame编写为镶木地板会创建空文件

时间:2019-06-19 16:04:32

标签: apache-spark apache-spark-sql cloudera parquet apache-spark-2.3

我正在尝试使用 bucketing 技术对Spark作业进行一些性能优化。我正在读取.parquet.csv文件并进行一些转换。完成存储并加入两个DataFrame之后。然后,我将加入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)。 当我在.show()上执行resultDF时,可以看到数据,但我的镶木地板文件为空。

+-----------+---------------+----------+
|       col1|          col2 |      col3|
+-----------+---------------+----------+
|33601234567|208012345678910|       LOL|
|33601234567|208012345678910|       LOL|
|33601234567|208012345678910|       LOL|

当我不将数据保存为表格时,写入镶木地板没有问题。仅在从表创建的DF中发生。

有什么建议吗?

预先感谢您的任何想法!

1 个答案:

答案 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")