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

Kan*_*ans 3 partitioning apache-spark parquet apache-spark-sql

我有一个DataFrame要尝试partitionBy插入的列,按该列对其进行排序,并使用以下命令以拼花格式保存:

df.write().format("parquet")
  .partitionBy("dynamic_col")
  .sortBy("dynamic_col")
  .save("test.parquet");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

reason: User class threw exception: org.apache.spark.sql.AnalysisException: 'save' does not support bucketing right now;
Run Code Online (Sandbox Code Playgroud)

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

任何建议都是有帮助的。

Dav*_*rba 6

问题在于,sortBy当前(Spark 2.3.1)仅与存储桶一起受支持,并且存储桶需要与存储桶结合使用saveAsTable,并且存储桶排序列不应成为分区列的一部分。

因此,您有两种选择:

  1. 不要使用sortBy

    df.write
    .format("parquet")
    .partitionBy("dynamic_col")
    .option("path", output_path)
    .save()
    
    Run Code Online (Sandbox Code Playgroud)
  2. sortBy与存储桶配合使用,并使用saveAsTable以下命令通过metastore保存:

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


sra*_*m24 0

尝试

df.repartition("dynamic_col")
  .write
  .partitionBy("dynamic_col")
  .parquet("test.parquet")
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以回答问题,但提供有关如何和/或为何解决问题的附加上下文将提高​​答案的长期价值。 (10认同)