2015-05-13 18 views
1

我希望將我的日誌數據的副本保存在S3上的Parquet on專用分析上。我主要通過Spark與Parquet一起工作,似乎只能通過SQLContext.parquetFile()SQLContext.saveAsParquetFile()提供讀取和寫入整個表格的操作。遞增地將數據添加到S3中的Parquet表中

有沒有什麼辦法可以將數據添加到現有Parquet表 而不寫出它的全部副本 特別是當它存儲在S3中時?

我知道我可以爲更新創建單獨的表,並且在Spark中我可以在查詢時形成Spark中的對應DataFrames的聯合,但是我對此的可伸縮性抱有懷疑。

如果需要,我可以使用Spark以外的其他東西。

回答

2

分開創建它們後,您不需要聯合DataFrames,只需將與查詢相關的所有路徑提供給parquetFile(paths)即可獲得一個DataFrame。正如閱讀鑲木地板文件的簽名:sqlContext.parquetFile(paths: String*)暗示。

引擎蓋下,在newParquetRelation2,所有.parquet從你提供的文件夾,以及文件中的所有_common_medata_metadata將被裝入single list和方面一視同仁。

+0

我這是有效的查詢爲一個單一的表? –

+0

@DanielMahler,我認爲差異可能被忽略,只需要處理一個'_metadata'文件,它不需要時間,我認爲 –

0

Amazon S3不支持附加。 S3是CDN(內容分發網絡),並不意味着支持寫入密集型操作。它針對並行讀取進行了優化。

這樣做的唯一方法是將您的數據分割爲多個文件,或將EC2用作文件服務器,並將其附加到一個位置。

+0

S3絕對不是CDN。 CDN是位於用戶附近的緩存服務器,而S3是非常可靠的對象存儲。這是真的,但它不支持附加(甚至重命名)。 很多時候人們同時使用[S3和CDN](http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/MigrateS3ToCloudFront.html)。 –

3

的方式追加到一個木文件使用SaveMode.Append

`yourDataFrame.write.mode(SaveMode.Append).parquet("/your/file")` 
+0

我重新說明了這一點,謝謝! – TomTom101