使用spark'save'时出错,目前不支持存储

时间:2018-10-14 02:40:21

标签: apache-spark apache-spark-sql partitioning parquet

我有一个DataFrame,我试图将其列为partitionBy,按该列对其进行排序,并使用以下命令以拼花格式保存:

df.write().format("parquet")
  .partitionBy("dynamic_col")
  .sortBy("dynamic_col")
  .save("test.parquet");

我收到以下错误:

reason: User class threw exception: org.apache.spark.sql.AnalysisException: 'save' does not support bucketing right now;

不允许save(...)吗? 仅允许将数据保存到Hive的saveAsTable(...)吗?

任何建议都是有帮助的。

2 个答案:

答案 0 :(得分:6)

问题是sortBy目前仅受saveAsTable支持({spark 2.3.1}),并且{bucket}与sortBy结合使用,并且bucket sorting列不应该属于分区列。

因此,您有两种选择:

  1. 请勿使用df.write .format("parquet") .partitionBy("dynamic_col") .option("path", output_path) .save()

    sortBy
  2. 使用saveAsTable进行存储分区,并使用df.write .format("parquet") .partitionBy("dynamic_col") .bucketBy(n, bucket_col) .sortBy(bucket_col) .option("path", output_path) .saveAsTable(table_name) 将其保存在元存储中:

    <input type="text" id="try"/>
    <input type="text" id="field11" value="777-a98;87-bx23;000-t88;245-k7"/>
    <input type="text" id="msg"/>
    <input type="button" id="submit"/>
    

答案 1 :(得分:0)

尝试

df.repartition("dynamic_col").write.partitionBy("dynamic_col").parquet("test.parquet")