【问题标题】:Error using spark 'save' does not support bucketing right now使用 spark 'save' 时出错,现在不支持分桶
【发布时间】:2019-03-18 20:03:55
【问题描述】:

我有一个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(...) 不允许吗? 是否只允许 saveAsTable(...) 将数据保存到 Hive?

任何建议都有帮助。

【问题讨论】:

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


    【解决方案1】:

    试试

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

    【讨论】:

    • 谢谢!该作业正在运行并进行上述更正。
    • 酷,没问题
    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    【解决方案2】:

    问题是sortBy 目前(Spark 2.3.1)仅支持分桶,分桶需要与saveAsTable 结合使用,并且桶排序列不应该是分区列的一部分。

    所以你有两个选择:

    1. 不要使用sortBy:

      df.write
      .format("parquet")
      .partitionBy("dynamic_col")
      .option("path", output_path)
      .save()
      
    2. sortBy 与分桶一起使用,并使用saveAsTable 将其保存到元存储中:

      df.write
      .format("parquet")
      .partitionBy("dynamic_col")
      .bucketBy(n, bucket_col)
      .sortBy(bucket_col)
      .option("path", output_path)
      .saveAsTable(table_name)
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      相关资源
      最近更新 更多