2017-10-28 112 views
5

它看起來像這樣就會因錯誤如何將具有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

回答

3
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:// ......」)是這裏的漁獲

相關問題