Uso de extractores de rutas - Amazon Athena

Uso de extractores de rutas

Amazon Ion es un formato de archivo de estilo de documento. Por otro lado, Apache Hive es un formato de columnas plano. Puede utilizar las propiedades especiales del SerDe de Amazon Ion denominadas path extractors para asignar entre los dos formatos. Los extractores de rutas aplanan el formato Amazon Ion jerárquico, asignan valores de Amazon Ion a columnas de Hive y se pueden utilizar para cambiar los nombres de los campos.

Athena puede generar los extractores por usted; sin embargo, usted también puede definir sus propios extractores si es necesario.

Extractores de rutas generados

Athena busca de forma predeterminada valores de Amazon Ion de nivel superior que coincidan con los nombres de las columnas de Hive y crea extractores de rutas en tiempo de ejecución en función de estos valores coincidentes. Si el formato de datos de Amazon Ion coincide con el esquema de tabla de Hive, Athena genera de forma dinámica los extractores por usted y usted no necesita agregar ningún extractor de ruta adicional. Estos extractores de rutas predeterminados no se almacenan en los metadatos de la tabla.

En el siguiente ejemplo, se muestra cómo Athena genera extractores en función del nombre de la columna.

-- 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 genera los siguientes extractores de ejemplo. El primero extrae el campo identification a la columna identification y el segundo extrae el campo alias a la columna alias.

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

En el siguiente ejemplo, se muestra la tabla que se extrajo.

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

Especificación de sus propios extractores de rutas

Si los campos de Amazon Ion no se asignan de forma perfecta a las columnas de Hive, puede especificar sus propios extractores de ruta. En la cláusula WITH SERDEPROPERTIES de la instrucción CREATE TABLE, utilice la siguiente sintaxis.

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

Los extractores de rutas distinguen entre mayúsculas y minúsculas de forma predeterminada. Para anular esta configuración, configure la propiedad del SerDe ion.path_extractor.case_sensitive en true.

Uso de rutas de búsqueda en extractores de rutas

La sintaxis de la propiedad del SerDe para el extractor de ruta contiene <path_extractor_expression>:

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

Puede utilizar <path_extractor_expression> para especificar una ruta de búsqueda que analice el documento de Amazon Ion y encuentre datos coincidentes. La ruta de búsqueda está entre paréntesis y puede contener uno o más de los siguientes componentes separados por espacios.

  • Comodín: coincide con todos los valores.

  • Índice: coincide con el valor del índice numérico especificado. Los índices están basados en cero.

  • Texto: coincide con todos los valores cuya coincidencia de nombres de campo son equivalentes al texto especificado.

  • Anotaciones: coincide con los valores especificados por un componente de ruta encapsulado que tiene las anotaciones especificadas.

En el siguiente ejemplo, se muestra un documento de Amazon Ion y algunas rutas de búsqueda de ejemplo.

-- 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"

Ejemplos de extractores

Aplanamiento y cambio de los nombres de los campos

En el siguiente ejemplo, se muestra un conjunto de rutas de búsqueda que aplanan y cambian los nombres de los campos. En el ejemplo, se utilizan las rutas de búsqueda para hacer lo siguiente:

  • asignar la columna nickname al campo alias y

  • asignar la columna name al subcampo name ubicado en la estructura identification.

A continuación, se presenta el documento de Amazon Ion de ejemplo.

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

A continuación, se muestra la instrucción CREATE TABLE de ejemplo que define los extractores de rutas.

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

En el siguiente ejemplo, se muestran los datos extraídos.

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

Para obtener más información sobre las rutas de búsqueda y ejemplos de rutas de búsqueda adicionales, consulte Ion Java Path Extraction (Extracción de rutas Ion Java) en GitHub.

Extracción de datos de vuelo en formato de texto

En el siguiente ejemplo, la consulta CREATE TABLE utiliza WITH SERDEPROPERTIES para agregar extractores de rutas con el objetivo de extraer datos de vuelo y especificar la codificación de salida como texto de Amazon Ion. En el ejemplo se utiliza la sintaxis 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/'