使用路徑擷取器 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用路徑擷取器

Amazon Ion 是文件樣式檔案格式,而 Apache Hive 是平面直欄式格式。您可以使用稱為在兩種格式之間path extractors進行映射的特殊 Amazon Ion SerDe 屬性。路徑擷取器會展平階層式 Amazon Ion 格式,將 Amazon Ion 值映射到 Hive 資料欄,並可用於重新命名欄位。

Athena 可以為您產生擷取器,但如有必要,您也可以定義自己的擷取器。

產生的路徑擷取器

依預設,Athena 會搜尋與 Hive 資料欄名稱相符的頂層 Amazon Ion 值,並根據這些相符的值在執行時間建立路徑擷取器。如果您的 Amazon Ion 資料格式與 Hive 資料表結構描述相符,Athena 會為您動態產生擷取器,並且您無需新增任何其他路徑擷取器。這些預設路徑擷取器不會存放在資料表中繼資料中。

下列範例說明了 Athena 如何根據資料欄名稱產生擷取器。

-- Example Amazon Ion Document { identification: { name: "John Smith", driver_license: "XXXX" }, alias: "Johnny" } -- Example DDL CREATE EXTERNAL TABLE example_schema2 ( identification MAP<STRING, STRING>, alias STRING ) STORED AS ION LOCATION 's3://DOC-EXAMPLE-BUCKET/path_extraction1/'

下列範例擷取器由 Athena 產生。第一個會將 identification 欄位擷取為 identification 資料欄,第二個會將 alias 欄位擷取為 alias 資料欄。

'ion.identification.path_extractor' = '(identification)' 'ion.alias.path_extractor' = '(alias)'

下列範例說明了擷取的資料表。

| identification | alias | |----------------------------------------------------|----------| |{["name", "driver_license"],["John Smith", "XXXX"]} | "Johnny" |

指定自己的路徑擷取器

如果您的 Amazon Ion 欄位未能整齊地映射到 Hive 資料欄,您可以指定自己的路徑擷取器。在 CREATE TABLE 陳述式的 WITH SERDEPROPERTIES 子句中,使用以下語法。

WITH SERDEPROPERTIES ( "ion.path_extractor.case_sensitive" = "<Boolean>", "ion.<column_name>.path_extractor" = "<path_extractor_expression>" )
注意

依預設,路徑擷取器不區分大小寫。若要覆寫此設定,請將ion.path_extractor.case_sensitive SerDe 屬性設定為true

在路徑擷取器中使用搜尋路徑

<path_extractor_expression>路徑提取器的 SerDe 屬性語法包含:

"ion.<column_name>.path_extractor" = "<path_extractor_expression>"

您可以使用 <path_extractor_expression> 來指定用於剖析 Amazon Ion 文件並尋找相符資料的搜尋路徑。搜尋路徑含括在括號內,並且可以包含以下一個或多個由空格分隔的元件。

  • 萬用字元 – 符合所有值。

  • 索引 – 符合指定數字索引位置的值。索引以零為起始。

  • 文字 – 符合欄位名稱與指定文字相符的所有值。

  • 註釋 – 符合具有指定註釋的包裝路徑元件指定的值。

下列範例說明了 Amazon Ion 文件和一些搜尋路徑範例。

-- Amazon Ion document { foo: ["foo1", "foo2"] , bar: "myBarValue", bar: A::"annotatedValue" } -- Example search paths (foo 0) # matches "foo1" (1) # matches "myBarValue" (*) # matches ["foo1", "foo2"], "myBarValue" and A::"annotatedValue" () # matches {foo: ["foo1", "foo2"] , bar: "myBarValue", bar: A::"annotatedValue"} (bar) # matches "myBarValue" and A::"annotatedValue" (A::bar) # matches A::"annotatedValue"

擷取器範例

展平和重新命名欄位

下列範例說明了一組展平和重新命名欄位的搜尋路徑。此範例使用搜尋路徑來執行下列動作:

  • nickname 資料欄映射至 alias 欄位

  • name 資料欄映射至位於 identification 結構中的 name 子欄位。

以下是 Amazon Ion 文件範例。

-- Example Amazon Ion Document { identification: { name: "John Smith", driver_license: "XXXX" }, alias: "Johnny" }

以下是定義路徑擷取器的範例 CREATE TABLE 陳述式。

-- Example DDL Query CREATE EXTERNAL TABLE example_schema2 ( name STRING, nickname STRING ) ROW FORMAT SERDE 'com.amazon.ionhiveserde.IonHiveSerDe' WITH SERDEPROPERTIES ( 'ion.nickname.path_extractor' = '(alias)', 'ion.name.path_extractor' = '(identification name)' ) STORED AS ION LOCATION 's3://DOC-EXAMPLE-BUCKET/path_extraction2/'

下列範例說明了擷取的資料。

-- Extracted Table | name | nickname | |--------------|--------------| | "John Smith" | "Johnny" |

如需有關搜尋路徑和其他搜尋路徑範例的詳細資訊,請參閱上的 Ion Java 路徑擷取頁面 GitHub。

將航班資料擷取為文字格式

以下 CREATE TABLE 查詢範例使用 WITH SERDEPROPERTIES 來新增路徑擷取器,以擷取航班資料並將輸出編碼指定為 Amazon Ion 文字。此範例使用 STORED AS ION 語法。

CREATE EXTERNAL TABLE flights_ion ( yr INT, quarter INT, month INT, dayofmonth INT, dayofweek INT, flightdate STRING, uniquecarrier STRING, airlineid INT, ) ROW FORMAT SERDE 'com.amazon.ionhiveserde.IonHiveSerDe' WITH SERDEPROPERTIES ( 'ion.encoding' = 'TEXT', 'ion.yr.path_extractor'='(year)', 'ion.quarter.path_extractor'='(results quarter)', 'ion.month.path_extractor'='(date month)') STORED AS ION LOCATION 's3://DOC-EXAMPLE-BUCKET/'