如何在 Amazon EMR 中連接 Parquet 檔案?

1 分的閱讀內容
0

我使用 S3DistCp (s3-dist-cp) 透過 --groupBy 和 --targetSize 選項連接 Apache Parquet 格式的檔案。s3-dist-cp 作業完成,沒有錯誤,但產生的 Parquet 檔案已損壞。當我嘗試讀取應用程式中的 Parquet 檔案時,收到類似如下的錯誤訊息: 「預期在 /path/to/concerned/parquet/file 偏移 m 處的欄塊中獲得 n 值,但在檔案偏移 z 處結束的 y 頁上獲得 x 值」

簡短描述

S3DistCp 不支援 Parquet 檔案的連接。請改用 PySpark

解決方法

您無法在 PySpark 中指定目標檔案大小,但可以指定分割區的數量。Spark 將每個分割區儲存到一個單獨的輸出檔案。若要估計所需的分割區數目,請用資料集的大小除以目標個別檔案大小。

1.    建立安裝了 Apache Spark 的 Amazon EMR 叢集

2.    指定您需要多少個執行程式。這取決於叢集容量和資料集大小。如需詳細資訊,請參閱在 Amazon EMR 上成功管理 Apache Spark 應用程式記憶體的最佳做法

$  pyspark --num-executors number_of_executors

3.    將來源 Parquet 檔案載入到 Spark DataFrame。這可以是 Amazon Simple Storage Service (Amazon S3) 路徑或 HDFS 路徑。例如:

df=sqlContext.read.parquet("s3://awsdoc-example-bucket/parquet-data/")

HDFS:

df=sqlContext.read.parquet("hdfs:///tmp/parquet-data/")

4.    重新分割 DataFrame。在下面的例子中,n 是分割區的數量。

df_output=df.coalesce(n)

5.    將 DataFrame 儲存到目標。這可以是 Amazon S3 路徑或 HDFS 路徑。例如:

df_output.write.parquet("URI:s3://awsdoc-example-bucket1/destination/")

HDFS:

df=sqlContext.write.parquet("hdfs:///tmp/destination/")

6.    驗證目標目錄中現在有多少個檔案:

hadoop fs -ls "URI:s3://awsdoc-example-bucket1/destination/ | wc -l"

檔案總數應為步驟 4 中的 n 值再加上一。Parquet 輸出提交程式會寫入額外檔案,稱為 _SUCCESS


AWS 官方
AWS 官方已更新 2 年前