Redacción de clasificadores personalizados para diversos formatos de datos - 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.

Redacción de clasificadores personalizados para diversos formatos de datos

Puede proporcionar un clasificador personalizado para clasificar los datos de AWS Glue. Puede crear un clasificador personalizado mediante un patrón grok, una XML etiqueta, una notación de JavaScript objeto (JSON) o 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 Creación de clasificadores mediante la consola 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 lo utiliza AWS Glue Data Catalog con Amazon Athena, Amazon o Redshift SpectrumEMR, consulte la documentación sobre esos servicios para obtener información sobre la compatibilidad de los. GrokSerDe Actualmente, es posible que tenga problemas al consultar las tablas creadas con Amazon EMR y Redshift Spectrum. GrokSerDe

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 para el clasificador grok

Al definir un clasificador grok, se proporcionan los siguientes valores 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

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)?)

Escribir XML clasificadores personalizados

XMLdefine la estructura de un documento con el uso de etiquetas en el archivo. Con un clasificador XML personalizado, puede especificar el nombre de la etiqueta utilizada para definir una fila.

Valores de clasificador personalizados para un clasificador XML

Al definir un XML clasificador, se proporcionan los siguientes valores 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 la XML etiqueta que define una fila de la tabla en el XML documento, sin corchetes angulares. < > El nombre debe cumplir con XML las reglas de 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, supongamos que tiene el siguiente XML archivo. 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>

Escribir JSON clasificadores personalizados

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

Valores personalizados del clasificador en AWS Glue

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

Nombre

Nombre del clasificador.

JSONruta

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

Operador Descripción
$ Elemento raíz de un JSON objeto. Esto inicia todas las expresiones de ruta
* Carácter comodín. Disponible en cualquier lugar de la JSON ruta en el que se requiera un nombre o un número.
.<name> Elemento secundario con notación de puntos. Especifica un campo secundario en un JSON objeto.
['<name>'] Elemento secundario con notación de corchete. Especifica el campo secundario de un JSON objeto. 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 JSON clasificador para extraer registros de una matriz

Suponga que sus JSON datos 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 con el JSON clasificador integrado, se utiliza todo el archivo para definir el esquema. Como no se especifica una JSON ruta, el rastreador trata los datos como un objeto, es decir, solo como una matriz. Por ejemplo, el esquema podría tener el siguiente aspecto:

root |-- record: array

Sin embargo, para crear un esquema que se base en cada registro de la JSON matriz, cree un JSON clasificador personalizado y especifique la JSON ruta como. $[*] Al especificar esta JSON ruta, el clasificador interroga 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 Utilizar un JSON clasificador para examinar solo partes de un archivo

Supongamos que JSON los datos siguen el patrón del JSON archivo de ejemplo s3://awsglue-datasets/examples/us-legislators/all/areas.json extraído de http://everypolitician.org/. Los objetos de ejemplo del JSON archivo tienen el siguiente aspecto:

{ "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 con el JSON clasificador integrado, se utiliza todo el archivo 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 utilizando únicamente el objeto «id», cree un JSON clasificador personalizado y especifique la JSON ruta 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 JSON archivo, puede crear un JSON clasificador personalizado y especificar la JSON ruta como. $.identifiers[*].identifier Aunque el esquema es similar al ejemplo anterior, se basa en un objeto diferente del JSON archivo.

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 muy anidado, como el campo «name» de la matriz other_names «» del JSON archivo, puede crear un JSON clasificador personalizado y especificar la JSON ruta como. $.other_names[*].name Aunque el esquema es similar al ejemplo anterior, se basa en un objeto diferente del JSON archivo. 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": "আলাস্কা"}

Escribir CSV clasificadores personalizados

CSVLos clasificadores personalizados permiten especificar los tipos de datos para cada columna del 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 valor SerDe para su procesamiento CSV en el clasificador, que se aplicará en el catálogo de datos.

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

  • En el caso de los archivos csv con solo encabezados (sin datos), estos archivos se clasificarán como archivos UNKNOWN porque no se proporciona suficiente información. Si especificas que la opción CSV «Tiene encabezados» en la opción de encabezados de columna y proporcionas los tipos de datos, podemos clasificar estos archivos correctamente.

Puede utilizar un CSV clasificador personalizado para deducir el esquema de varios tipos de datos. CSV Los atributos personalizados que puede proporcionar al clasificador incluyen delimitadores, una CSV SerDe opción, opciones sobre el encabezado y la posibilidad de realizar determinadas validaciones en los datos.

Valores personalizados del clasificador en AWS Glue

Al definir un CSV clasificador, debe proporcionar los siguientes valores para AWS Glue crear el clasificador. El campo de clasificación de este clasificador se establece en csv.

Classifier name (Nombre de clasificador)

Nombre del clasificador.

CSVSerde

Establece el SerDe valor para su procesamiento CSV en el clasificador, que se aplicará en el catálogo de datos. Las opciones son Abierto CSV SerDe, Lazy Simple SerDe y Ninguno. 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 el comportamiento que debe seguirse para detectar los encabezados de las columnas en el CSV archivo. Si el CSV archivo personalizado tiene encabezados de columna, introduzca una lista de encabezados de columna delimitados por comas.

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: «BINARY», «BOOLEAN», «DATE», «DECIMAL», «DOUBLE», «FLOAT», «INT», «LONG», «SHORT». STRING TIMESTAMP Los tipos de datos no compatibles mostrarán un error.