Escritura de clasificadores personalizados - AWS Glue

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Escritura de clasificadores personalizados

Puede proporcionar un clasificador personalizado para clasificar los datos de AWS Glue. Puede crear un clasificador personalizado con un patrón grok, con una etiqueta XML, con la notación de objetos JavaScript (JSON) o con valores separados por comas (CSV). Un rastreador de AWS Glue llama a un clasificador personalizado. Si el clasificador reconoce los datos, devuelve la clasificación y el esquema de los datos al rastreador. Puede que tenga que definir un clasificador personalizado si sus datos no coinciden con ningún clasificador integrado o si desea personalizar las tablas creadas por el rastreador.

Para obtener información adicional acerca de cómo crear un clasificador mediante la consola de AWS Glue, consulte Trabajo con clasificadores en la consola de AWS Glue.

AWS Glue ejecuta los clasificadores personalizados antes que los integrados, en el orden especificado. Cuando un rastreador encuentra un clasificador que coincide con los datos, la cadena de clasificación y el esquema se usan en la definición de las tablas escritas en su AWS Glue Data Catalog.

Escritura de clasificadores personalizados de Grok

Grok es una herramienta que se usa para analizar datos textuales con un patrón coincidente. Un patrón de grok es un conjunto designado de expresiones regulares (regex) que se usan para que los datos coincidan con una línea a la vez. AWS Glue usa patrones de grok para inferir el esquema de sus datos. Cuando un patrón de grok coincide con sus datos, AWS Glue usa el patrón para determinar la estructura de sus datos y mapearlos en campos.

AWS Glue proporciona muchos patrones integrados o usted puede definir los suyos propios. Puede crear un patrón de grok mediante patrones integrados y personalizados en su definición personalizada del clasificador. Puede adaptar un patrón de grok para clasificar formatos de archivos de texto personalizados.

nota

Los clasificadores personalizados de grok de AWS Glue usan la biblioteca de serialización GrokSerDe para las tablas creadas en AWS Glue Data Catalog. Si usa AWS Glue Data Catalog con Amazon Athena, Amazon EMR o Redshift Spectrum, consulte la documentación acerca de esos servicios para obtener información acerca del soporte de GrokSerDe. Actualmente, podría tener problemas al consultar las tablas creadas con GrokSerDe desde Amazon EMR y Redshift Spectrum.

Esta es la sintaxis básica para los componentes de un patrón de grok:

%{PATTERN:field-name}

Los datos que coinciden con el elemento PATTERN designado se mapean a la columna field-name del esquema, con un tipo de datos predeterminado de string. Si lo prefiere, el tipo de datos para el campo se puede convertir en byte, boolean, double, short, int, long o float en el esquema resultante.

%{PATTERN:field-name:data-type}

Por ejemplo, para convertir un campo num en un tipo de datos int, puede usar este patrón:

%{NUMBER:num:int}

Los patrones se pueden componer de otros patrones. Por ejemplo, puede tener un patrón para una marca temporal SYSLOG definida utilizando patrones para el mes, el día del mes y la hora (por ejemplo, Feb 1 06:25:43). Para estos datos, puede definir el siguiente patrón:

SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
nota

Los patrones de grok pueden procesar una única línea a la vez. No se admiten los patrones de varias líneas. Asimismo, no se admiten los saltos de línea dentro de un patrón.

Valores personalizados del clasificador en AWS Glue

Al definir un clasificador de grok, proporciona los siguientes valores a AWS Glue para crear el clasificador personalizado.

Nombre

Nombre del clasificador.

Clasificación

La cadena de texto que se escribe para describir el formato de los datos que se clasifican; por ejemplo, special-logs.

Patrón de Grok

El conjunto de patrones que se aplican al almacén de datos para determinar si existe una coincidencia. Estos patrones proceden de AWS Gluepatrones integrados de y cualquier patrón personalizado que defina.

A continuación se muestra un ejemplo de un patrón de grok:

%{TIMESTAMP_ISO8601:timestamp} \[%{MESSAGEPREFIX:message_prefix}\] %{CRAWLERLOGLEVEL:loglevel} : %{GREEDYDATA:message}

Cuando los datos coinciden con TIMESTAMP_ISO8601, se crea una columna de esquema timestamp. El comportamiento es similar para los otros patrones designados del ejemplo.

Patrones personalizados

Patrones personalizados opcionales definidos por usted. El patrón de grok que clasifica sus datos hace referencia a estos patrones. Puede hacer referencia a estos patrones personalizados en el patrón de grok aplicado a sus datos. Cada patrón de componente personalizado debe estar en una línea independiente. La sintaxis Expresión regular (regex) se usa para definir el patrón.

A continuación se muestra un ejemplo del uso de patrones personalizados:

CRAWLERLOGLEVEL (BENCHMARK|ERROR|WARN|INFO|TRACE) MESSAGEPREFIX .*-.*-.*-.*-.*

El primer patrón designado personalizado, CRAWLERLOGLEVEL, es una coincidencia si los datos coinciden con una de las cadenas enumeradas. El segundo patrón personalizado, MESSAGEPREFIX, intenta coincidir con una cadena prefijo del mensaje.

AWS Glue realiza un seguimiento de la hora de creación, la hora de la última actualización y la versión de su clasificador.

Patrones integrados de AWS Glue

AWS Glue proporciona muchos patrones comunes que puede usar para crear un clasificador personalizado. Puede añadir un patrón designado a grok pattern en una definición del clasificador.

La siguiente lista consta de una línea para cada patrón. En cada línea, al nombre del patrón le sigue su definición. Para definir el patrón, se utiliza la sintaxis de las expresiones regulares (regex).

#<noloc>&GLU;</noloc> Built-in patterns USERNAME [a-zA-Z0-9._-]+ USER %{USERNAME:UNWANTED} INT (?:[+-]?(?:[0-9]+)) BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))) NUMBER (?:%{BASE10NUM:UNWANTED}) BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+)) BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b BOOLEAN (?i)(true|false) POSINT \b(?:[1-9][0-9]*)\b NONNEGINT \b(?:[0-9]+)\b WORD \b\w+\b NOTSPACE \S+ SPACE \s* DATA .*? GREEDYDATA .* #QUOTEDSTRING (?:(?<!\\)(?:"(?:\\.|[^\\"])*"|(?:'(?:\\.|[^\\'])*')|(?:`(?:\\.|[^\\`])*`))) QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``)) UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12} # Networking MAC (?:%{CISCOMAC:UNWANTED}|%{WINDOWSMAC:UNWANTED}|%{COMMONMAC:UNWANTED}) CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4}) WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2}) COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}) IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)? IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9]) IP (?:%{IPV6:UNWANTED}|%{IPV4:UNWANTED}) HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\.?|\b) HOST %{HOSTNAME:UNWANTED} IPORHOST (?:%{HOSTNAME:UNWANTED}|%{IP:UNWANTED}) HOSTPORT (?:%{IPORHOST}:%{POSINT:PORT}) # paths PATH (?:%{UNIXPATH}|%{WINPATH}) UNIXPATH (?>/(?>[\w_%!$@:.,~-]+|\\.)*)+ #UNIXPATH (?<![\w\/])(?:/[^\/\s?*]*)+ TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+)) WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+ URIPROTO [A-Za-z]+(\+[A-Za-z+]+)? URIHOST %{IPORHOST}(?::%{POSINT:port})? # uripath comes loosely from RFC1738, but mostly from what Firefox # doesn't turn into %XX URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+ #URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)? URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]* URIPATHPARAM %{URIPATH}(?:%{URIPARAM})? URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})? # Months: January, Feb, 3, 03, 12, December MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b MONTHNUM (?:0?[1-9]|1[0-2]) MONTHNUM2 (?:0[1-9]|1[0-2]) MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) # Days: Monday, Tue, Thu, etc... DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?) # Years? YEAR (?>\d\d){1,2} # Time: HH:MM:SS #TIME \d{2}:\d{2}(?::\d{2}(?:\.\d+)?)? # TIME %{POSINT<24}:%{POSINT<60}(?::%{POSINT<60}(?:\.%{POSINT})?)? HOUR (?:2[0123]|[01]?[0-9]) MINUTE (?:[0-5][0-9]) # '60' is a leap second in most time standards and thus is valid. SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?) TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]) # datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it) DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR} DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR} DATESTAMP_US %{DATE_US}[- ]%{TIME} DATESTAMP_EU %{DATE_EU}[- ]%{TIME} ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE})) ISO8601_SECOND (?:%{SECOND}|60) TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}? TZ (?:[PMCE][SD]T|UTC) DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ} DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE} DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR} DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND} CISCOTIMESTAMP %{MONTH} %{MONTHDAY} %{TIME} # Syslog Dates: Month Day HH:MM:SS SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME} PROG (?:[\w._/%-]+) SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])? SYSLOGHOST %{IPORHOST} SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}> HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT} # Shortcuts QS %{QUOTEDSTRING:UNWANTED} # Log formats SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}: MESSAGESLOG %{SYSLOGBASE} %{DATA} COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{Bytes:bytes=%{NUMBER}|-}) COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} COMMONAPACHELOG_DATATYPED %{IPORHOST:clientip} %{USER:ident;boolean} %{USER:auth} \[%{HTTPDATE:timestamp;date;dd/MMM/yyyy:HH:mm:ss Z}\] "(?:%{WORD:verb;string} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion;float})?|%{DATA:rawrequest})" %{NUMBER:response;int} (?:%{NUMBER:bytes;long}|-) # Log Levels LOGLEVEL ([A|a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)

Escritura de clasificadores personalizados XML

XML define la estructura de un documento utilizando etiquetas en el archivo. Con un clasificador personalizado XML, puede especificar el nombre de etiqueta usado para definir una fila.

Valores personalizados del clasificador en AWS Glue

Al definir un clasificador XML, proporciona los siguientes valores a AWS Glue para crear el clasificador. El campo de clasificación de este clasificador se establece en xml.

Nombre

Nombre del clasificador.

Etiqueta de fila

El nombre de etiqueta XML que define una fila de tabla en el documento XML, sin paréntesis < >. El nombre debe cumplir las reglas de XML para una etiqueta.

nota

El elemento que contiene los datos de fila no puede ser un elemento vacío de autocierre. Por ejemplo, noAWS Glue analiza este elemento vacío:

<row att1=”xx” att2=”yy” />

Los elementos vacíos se pueden escribir de la siguiente manera:

<row att1=”xx” att2=”yy”> </row>

AWS Glue realiza un seguimiento de la hora de creación, la hora de la última actualización y la versión de su clasificador.

Por ejemplo, suponga que tiene el archivo XML siguiente. Para crear una tabla de AWS Glue que solo contiene columnas para autor y título, cree un clasificador en la consola de AWS Glue con Row tag (Etiqueta de fila) como AnyCompany. A continuación, añada y ejecute un rastreador que use este clasificador personalizado.

<?xml version="1.0"?> <catalog> <book id="bk101"> <AnyCompany> <author>Rivera, Martha</author> <title>AnyCompany Developer Guide</title> </AnyCompany> </book> <book id="bk102"> <AnyCompany> <author>Stiles, John</author> <title>Style Guide for AnyCompany</title> </AnyCompany> </book> </catalog>

Escritura de clasificadores personalizados JSON

JSON es un formato de intercambio de datos. Define estructuras de datos con pares nombre-valor o una lista ordenada de valores. Con un clasificador personalizado JSON, puede especificar la ruta de JSON a una estructura de datos que se usa para definir el esquema para su tabla.

Valores personalizados del clasificador en AWS Glue

Al definir un clasificador JSON, proporciona los siguientes valores a AWS Glue para crear el clasificador. El campo de clasificación de este clasificador se establece en json.

Nombre

Nombre del clasificador.

JSON path (Ruta JSON)

Ruta de JSON que apunta a un objeto que se usa para definir un esquema de tabla. La ruta de JSON se puede escribir en la notación de puntos o la notación de corchete. Se admiten los siguientes operadores:

"." Descripción
$ Elemento raíz de un objeto JSON. Esto inicia todas las expresiones de ruta
* Carácter comodín. Disponible allí donde se requiera un nombre o un valor numérico en la ruta de JSON.
.<name> Elemento secundario con notación de puntos. Especifica un campo secundario en un objeto JSON.
['<name>'] Elemento secundario con notación de corchete. Especifica el campo secundario en un objeto JSON. Solo se puede especificar un único campo secundario.
[<number>] Índice de matriz. Especifica el valor de una matriz por índice.

AWS Glue realiza un seguimiento de la hora de creación, la hora de la última actualización y la versión de su clasificador.

ejemplo Uso de un clasificador JSON para extraer registros de una matriz

Supongamos que sus datos JSON son una matriz de registros. Por ejemplo, las primeras líneas de su archivo podrían tener el siguiente aspecto:

[ { "type": "constituency", "id": "ocd-division\/country:us\/state:ak", "name": "Alaska" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:1", "name": "Alabama's 1st congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:2", "name": "Alabama's 2nd congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:3", "name": "Alabama's 3rd congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:4", "name": "Alabama's 4th congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:5", "name": "Alabama's 5th congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:6", "name": "Alabama's 6th congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:al\/cd:7", "name": "Alabama's 7th congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:ar\/cd:1", "name": "Arkansas's 1st congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:ar\/cd:2", "name": "Arkansas's 2nd congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:ar\/cd:3", "name": "Arkansas's 3rd congressional district" }, { "type": "constituency", "id": "ocd-division\/country:us\/state:ar\/cd:4", "name": "Arkansas's 4th congressional district" } ]

Al ejecutar un rastreador mediante el clasificador JSON integrado, todo el archivo se usará para definir el esquema. Como no especifica una ruta de JSON, el rastreador tratará los datos como un objeto, es decir, solo una matriz. Por ejemplo, el esquema podría tener el siguiente aspecto:

root |-- record: array

Sin embargo, para crear un esquema que se basa en cada registro de la matriz JSON, cree un clasificador JSON personalizado y especifique la ruta de JSON como $[*]. Al especificar esta ruta de JSON, el clasificador interroga a los 12 registros de la matriz para determinar el esquema. El esquema resultante contiene campos independientes para cada objeto, similares al siguiente ejemplo:

root |-- type: string |-- id: string |-- name: string
ejemplo Uso de un clasificador JSON para examinar solo las partes de un archivo

Supongamos que sus datos JSON siguen el patrón del archivo JSON de ejemplo s3://awsglue-datasets/examples/us-legislators/all/areas.json procedente de http://everypolitician.org/. Los objetos de ejemplo del archivo JSON tienen un aspecto similar al siguiente:

{ "type": "constituency", "id": "ocd-division\/country:us\/state:ak", "name": "Alaska" } { "type": "constituency", "identifiers": [ { "scheme": "dmoz", "identifier": "Regional\/North_America\/United_States\/Alaska\/" }, { "scheme": "freebase", "identifier": "\/m\/0hjy" }, { "scheme": "fips", "identifier": "US02" }, { "scheme": "quora", "identifier": "Alaska-state" }, { "scheme": "britannica", "identifier": "place\/Alaska" }, { "scheme": "wikidata", "identifier": "Q797" } ], "other_names": [ { "lang": "en", "note": "multilingual", "name": "Alaska" }, { "lang": "fr", "note": "multilingual", "name": "Alaska" }, { "lang": "nov", "note": "multilingual", "name": "Alaska" } ], "id": "ocd-division\/country:us\/state:ak", "name": "Alaska" }

Al ejecutar un rastreador mediante el clasificador JSON integrado, todo el archivo se usará para crear el esquema. Es posible que termine contando con un esquema similar a este:

root |-- type: string |-- id: string |-- name: string |-- identifiers: array | |-- element: struct | | |-- scheme: string | | |-- identifier: string |-- other_names: array | |-- element: struct | | |-- lang: string | | |-- note: string | | |-- name: string

Sin embargo, para crear un esquema con solo el objeto "id", cree un clasificador JSON personalizado y especifique la ruta de JSON como $.id. A continuación, el esquema se basa solo en el campo "id":

root |-- record: string

Las primeras líneas de datos extraídas con este esquema tienen el siguiente aspecto:

{"record": "ocd-division/country:us/state:ak"} {"record": "ocd-division/country:us/state:al/cd:1"} {"record": "ocd-division/country:us/state:al/cd:2"} {"record": "ocd-division/country:us/state:al/cd:3"} {"record": "ocd-division/country:us/state:al/cd:4"} {"record": "ocd-division/country:us/state:al/cd:5"} {"record": "ocd-division/country:us/state:al/cd:6"} {"record": "ocd-division/country:us/state:al/cd:7"} {"record": "ocd-division/country:us/state:ar/cd:1"} {"record": "ocd-division/country:us/state:ar/cd:2"} {"record": "ocd-division/country:us/state:ar/cd:3"} {"record": "ocd-division/country:us/state:ar/cd:4"} {"record": "ocd-division/country:us/state:as"} {"record": "ocd-division/country:us/state:az/cd:1"} {"record": "ocd-division/country:us/state:az/cd:2"} {"record": "ocd-division/country:us/state:az/cd:3"} {"record": "ocd-division/country:us/state:az/cd:4"} {"record": "ocd-division/country:us/state:az/cd:5"} {"record": "ocd-division/country:us/state:az/cd:6"} {"record": "ocd-division/country:us/state:az/cd:7"}

Para crear un esquema basado en un objeto profundamente anidado, como "identifier", en el archivo JSON, puede crear un clasificador JSON personalizado y especificar la ruta de JSON como $.identifiers[*].identifier. Aunque el esquema es similar al ejemplo anterior, se basa en un objeto diferente del archivo JSON.

El esquema sería similar al siguiente:

root |-- record: string

Al mostrar las primeras líneas de datos de la tabla, se muestra a su vez que el esquema se basa en los datos del objeto "identifier":

{"record": "Regional/North_America/United_States/Alaska/"} {"record": "/m/0hjy"} {"record": "US02"} {"record": "5879092"} {"record": "4001016-8"} {"record": "destination/alaska"} {"record": "1116270"} {"record": "139487266"} {"record": "n79018447"} {"record": "01490999-8dec-4129-8254-eef6e80fadc3"} {"record": "Alaska-state"} {"record": "place/Alaska"} {"record": "Q797"} {"record": "Regional/North_America/United_States/Alabama/"} {"record": "/m/0gyh"} {"record": "US01"} {"record": "4829764"} {"record": "4084839-5"} {"record": "161950"} {"record": "131885589"}

Para crear una tabla basada en otro objeto profundamente anidado, como el campo "name" de la matriz "other_names" del archivo JSON, puede crear un clasificador JSON personalizado y especificar la ruta de JSON como $.other_names[*].name. Aunque el esquema es similar al ejemplo anterior, se basa en un objeto diferente del archivo JSON. El esquema sería similar al siguiente:

root |-- record: string

Al mostrar las primeras líneas de datos de la tabla, se muestra a su vez que se basa en los datos del objeto "name" de la matriz "other_names":

{"record": "Alaska"} {"record": "Alaska"} {"record": "Аляска"} {"record": "Alaska"} {"record": "Alaska"} {"record": "Alaska"} {"record": "Alaska"} {"record": "Alaska"} {"record": "Alaska"} {"record": "ألاسكا"} {"record": "ܐܠܐܣܟܐ"} {"record": "الاسكا"} {"record": "Alaska"} {"record": "Alyaska"} {"record": "Alaska"} {"record": "Alaska"} {"record": "Штат Аляска"} {"record": "Аляска"} {"record": "Alaska"} {"record": "আলাস্কা"}

Escritura de clasificadores personalizados CSV

Los clasificadores CSV personalizados permiten especificar los tipos de datos para cada columna en el campo del clasificador CSV personalizado. Se puede especificar el tipo de datos separados por una coma. Al especificar los tipos de datos, se pueden anular los tipos de datos inferidos por los rastreadores y garantizar que los datos se clasifiquen correctamente.

Puede configurar el SerDe para procesar CSV en el clasificador, lo que se aplicará en el Data Catalog.

Al crear un clasificador personalizado, también se puede volver a utilizarlo para diferentes rastreadores.

  • Para los archivos CSV con solo encabezados (sin datos), estos archivos se clasificarán como DESCONOCIDOS ya que no se proporciona suficiente información. Si especifica que el CSV "tiene encabezados" en la opción Encabezados de columna y proporciona los tipos de datos, se pueden clasificar estos archivos correctamente.

Puede utilizar un clasificador CSV personalizado para deducir el esquema de distintos tipos de datos CSV. Entre los atributos personalizados que puede proporcionar para el clasificador, se incluyen los delimitadores, una opción de SerDe de CSV, las opciones sobre el encabezado y si se van a realizar o no ciertas validaciones de los datos.

Valores personalizados del clasificador en AWS Glue

Cuando defina un clasificador CSV, debe proporcionar los siguientes valores a AWS Glue para que pueda crear el clasificador. El campo de clasificación de este clasificador se establece en csv.

Classifier name (Nombre de clasificador)

Nombre del clasificador.

Serde de CSV

Establece el SerDe para procesar CSV en el clasificador, que se aplicará en el catálogo de datos. Las opciones son Open CSV SerDe, Lazy Simple SerDe y None. Puede especificar el valor Ninguno cuando desee que el rastreador realice la detección.

Delimitador de columnas

Símbolo personalizado que indica qué elemento va a separar cada entrada de columna en la fila. Proporcione un carácter Unicode. Si no puede escribir el delimitador, puede copiarlo y pegarlo. Esto funciona con los caracteres imprimibles, incluidos con los que el sistema no es compatible (normalmente se muestran como □).

Símbolo de comillas

Símbolo personalizado que indica qué elemento va a combinar contenido en un valor de columna único. Debe ser diferente al delimitador de columnas. Proporcione un carácter Unicode. Si no puede escribir el delimitador, puede copiarlo y pegarlo. Esto funciona con los caracteres imprimibles, incluidos con los que el sistema no es compatible (normalmente se muestran como □).

Encabezados de columna

Indica cómo deben detectarse los encabezados de columna en el archivo CSV. Si el archivo CSV personalizado tiene encabezados de columna, escriba una lista delimitada por comas con los encabezados de columna.

Opciones de procesamiento: permitir archivos con una sola columna

Permite procesar los archivos que contienen una sola columna.

Opciones de procesamiento: quitar un espacio en blanco antes de identificar los valores de columna

Indica si los valores se van a recortar antes de identificar el tipo de valores de columna.

Tipos de datos personalizados: opcional

Ingrese el tipo de datos personalizado separados por una coma. Especifica los tipos de datos personalizados del archivo CSV. El tipo de datos personalizado debe ser un tipo de datos compatible. Los tipos de datos admitidos son: "BINARIO", "BOOLEANO", "FECHA", "DECIMAL", "DOUBLE", "FLOAT", "INT", "LONG", "SHORT", "STRING", "TIMESTAMP". Los tipos de datos no compatibles mostrarán un error.