我使用 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。