UNLOAD - Amazon Athena

UNLOAD

SELECT 陳述式寫入查詢結果至指定的資料格式。針對 UNLOAD 支援的格式包括 Apache Parquet、ORC、Apache Avro 和 JSON。CSV 是 Athena SELECT 命令支援的唯一輸出格式,但您可以使用支援各種輸出格式的 UNLOAD 命令來括住 SELECT 查詢,並將其輸出重寫為 UNLOAD 支援的其中一種格式。

雖然您可以使用 CREATE TABLE AS (CTAS) 陳述式以 CSV 以外的格式輸出資料,但 CTAS 陳述式需要在 Athena 中建立資料表。UNLOAD 陳述式在您想以非 CSV 格式輸出 SELECT 查詢結果,但不要相關聯的資料表時十分有用。例如,下游應用程式可能需要 SELECT 查詢結果使用 JSON 格式,而且如果您打算對其他分析使用 SELECT 查詢結果,則 Parquet 或 ORC 的效能可能優於 CSV。

考量與限制

當您在 Athena 中使用 UNLOAD 陳述式時,請謹記以下幾點:

  • 沒有檔案的全域排序UNLOAD結果會同時寫入多個檔案。如果 UNLOAD 陳述式中的 SELECT 查詢會指定排序順序,則每個檔案的內容會依排序順序排列,但檔案並不會彼此排序。

  • 未刪除孤立資料 – 在發生故障的情況下,Athena 不會嘗試刪除孤立的資料。此行為同於 CTAS 和 INSERT INTO 陳述式。

  • 分割區數量上限 – 可搭配 UNLOAD 使用的分割區數量上限為 100。

  • 中繼資料和資訊清單檔案 – Athena 會為每個 UNLOAD 查詢產生中繼資料檔案和資訊清單檔案。資訊清單會追蹤查詢寫入的檔案。這兩個檔案都會儲存到 Amazon S3 中的 Athena 查詢結果位置。如需詳細資訊,請參閱識別查詢輸出檔案

  • 加密UNLOAD 輸出檔案會根據用於 Amazon S3 的加密組態進行加密。若要設定加密組態來加密 UNLOAD 結果,您可以使用 EncryptionConfiguration API

  • 預備陳述式UNLOAD 可以與預備的陳述式一起使用。如需有關 Athena 中的預備陳述式的資訊,請參閱使用參數化查詢

  • 服務配額UNLOAD 會使用 DML 查詢配額。如需有關配額的資訊,請參閱 Service Quotas

  • 預期的儲存貯體擁有者 – 預期的儲存貯體擁有者設定不適用於 UNLOAD 查詢中指定的目的地 Amazon S3 位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Amazon S3 輸出位置。如需詳細資訊,請參閱使用 Athena 主控台指定查詢結果位置

語法

UNLOAD 陳述式使用下列語法。

UNLOAD (SELECT col_name[, ...] FROM old_table) TO 's3://amzn-s3-demo-bucket/my_folder/' WITH ( property_name = 'expression' [, ...] )

除了寫入分割區時,TO 目標必須在沒有資料的 Amazon S3 中指定位置。在 UNLOAD 查詢寫入指定位置之前,它會驗證儲存貯體位置是否為空。由於 UNLOAD 在指定位置已經有資料時不會將資料寫入該位置,UNLOAD 不會覆寫現有資料。若要重複使用儲存貯體位置作為 UNLOAD 的目標,請刪除儲存貯體位置中的資料,然後再次執行查詢。

請注意,當 UNLOAD 寫入分割區時,此行為會有所不同。如果您多次執行具有相同 SELECT 陳述式、相同 TO 位置和相同分割區的相同 UNLOAD 查詢,則每個 UNLOAD 查詢都會在指定的位置和分割區將資料卸載至 Amazon S3。

參數

property_name 可能的值如下。

格式 = 'file_format'

必要。指定輸出的檔案格式。file_format 的可能值為 ORCPARQUETAVROJSONTEXTFILE

壓縮 = 'compression_format'

選用。此選項僅適用於 ORC 和 Parquet 格式。ORC 的預設值為 zlib,而 Parquet 的預設值則為 gzip。如需有關支援的壓縮格式的資訊,請參閱 Athena 壓縮支援

注意

此選項不適用於 AVRO 格式。Athena 對 JSONTEXTFILE 格式使用 gzip

compression_level = compression_level

選用。用於 ZSTD 壓縮的壓縮級別。此屬性僅適用於 ZSTD 壓縮。如需更多詳細資訊,請參閱 使用 ZSTD 壓縮級別

field_delimiter = 'delimiter'

選用。指定 CSV、TSV 和其他文字格式檔案的單一字元欄位分隔符號。以下範例指定逗點分隔符號。

WITH (field_delimiter = ',')

目前不支援多字元欄位分隔符號。如果您未指定欄位分隔符號,系統會使用八進位制字元 \001 (^A)。

partitioned_by = ARRAY[ col_name[,...] ]

選用。資料欄的陣列清單,輸出依這些資料欄進行分割。

注意

SELECT 陳列式中,請確保已分割資料欄的名稱位於資料欄清單中的最後。

範例

下列範例會使用 JSON 格式,將 SELECT 查詢的輸出寫入 Amazon S3 位置 s3://amzn-s3-demo-bucket/unload_test_1/

UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/unload_test_1/' WITH (format = 'JSON')

下列範例會採用 Snappy 壓縮方式以 Parquet 格式寫入 SELECT 查詢的輸出。

UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/' WITH (format = 'PARQUET',compression = 'SNAPPY')

下列範例會以文字格式寫入四個資料欄,且輸出依最後一個資料欄分割。

UNLOAD (SELECT name1, address1, comment1, key1 FROM table1) TO 's3://amzn-s3-demo-bucket/ partitioned/' WITH (format = 'TEXTFILE', partitioned_by = ARRAY['key1'])

下列範例會使用 Parquet 檔案格式、ZSTD 壓縮和 ZSTD 壓縮級別 4,將查詢結果卸載到指定的位置。

UNLOAD (SELECT * FROM old_table) TO 's3://amzn-s3-demo-bucket/' WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)

其他資源