경로 추출기 사용 - 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로 설정합니다.

경로 추출기에서 검색 경로 사용

경로 추출기의 SerDe 속성 구문은 <path_extractor_expression>을 포함합니다.

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

<path_extractor_expression>을 사용하여 Amazon Ion 문서를 구문 분석하고 일치하는 데이터를 찾는 검색 경로를 지정할 수 있습니다. 검색 경로는 괄호로 묶여 있으며 다음 구성 요소 중 하나 이상을 공백으로 구분하여 포함할 수 있습니다.

  • 와일드 카드 - 모든 값과 일치합니다.

  • 인덱스 - 지정된 숫자 인덱스의 값과 일치합니다. 인덱스는 0부터 시작됩니다.

  • 텍스트 - 필드 이름이 지정된 텍스트와 동일한 모든 값과 일치합니다.

  • 주석 - 지정된 주석을 갖는 래핑된 경로 구성 요소에 의해 지정된 값과 일치합니다.

다음 예제에서는 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" |

검색 경로 및 추가 검색 경로 예제에 대한 자세한 내용은 GitHub의 Ion Java Path Extraction(Ion Java 경로 추출) 페이지를 참조하세요.

비행 데이터를 텍스트 형식으로 추출

다음 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/'