如何将具有bucketBy/sortkey值的parquet文件保存到s3中?

问题描述:

它看起来像这样就会因错误如何将具有bucketBy/sortkey值的parquet文件保存到s3中?

 df 
      .write() 
      .option("mode", "DROPMALFORMED") 
      .option("compression", "snappy") 
      .mode("overwrite") 
      .bucketBy(32,"column").sortBy("column") 
      .parquet("s3://...."); 

有了错误

Exception in thread "main" org.apache.spark.sql.AnalysisException: 'save' does not support bucketing right now; at org.apache.spark.sql.DataFrameWriter.assertNotBucketed(DataFrameWriter.scala:314) 

我看到saveAsTable("myfile")仍然支持,但是它只能在本地写道。在作业完成后,我会如何将saveAsTable(...)输出放到s3上?

+0

你有没有考虑使用'再分配(32)'''partitionBy(“column”)'? –

+0

Parition by通过为每个列创建一个新文件,bucket通过创建一个散列键并均匀分布在N个桶中。他们做不同的事情。在我的情况下,我想要存储的列是用户ID,这是唯一的。我真正想要的是bucketby提供的sortkey/index。 – ForeverConfused

You Can use like below: 

    df 
       .write() 
       .option("mode", "DROPMALFORMED") 
       .option("compression", "snappy") 
       .option("path","s3://....") 
       .mode("overwrite") 
       .format("parquet") 
       .bucketBy(32,"column").sortBy("column") 
       .saveAsTable("tableName"); 

这将创建一个外部表指向S3位置 。选项(“路径”,“S3:// ......”)是这里的渔获