Você pode fornecer um classificador personalizado para classificar seus dados no AWS Glue. Você pode criar um classificador personalizado usando um padrão grok, uma tag XML, JavaScript Object Notation (JSON) ou valores separados por vírgula (CSV). Um crawler do AWS Glue chama um classificador personalizado. Se o classificador reconhecer os dados, ele retornará a classificação e o esquema dos dados ao crawler. Você precisará definir um classificador personalizado se seus dados não coincidirem com os classificadores integrados ou se você quiser personalizar as tabelas criadas pelo crawler.
Para obter mais informações sobre como criar um classificador usando o console do AWS Glue, consulte Criar classificadores usando o console do AWS Glue.
O AWS Glue executa os classificadores personalizados antes dos classificadores integrados, na ordem que você especificar. Quando um crawler encontra um classificador que corresponde aos dados, o esquema e a string de classificação são usados na definição das tabelas gravadas no seu AWS Glue Data Catalog.
Tópicos
Gravar classificadores grok personalizados
Grok é uma ferramenta usada para analisar dados textuais em um determinado padrão de correspondência. Um padrão grok é um conjunto nomeado de expressões regulares (regex) que são usadas para corresponder dados uma linha por vez. O AWS Glue usa padrões grok usa para inferir o esquema dos seus dados. Quando um padrão grok corresponde aos seus dados, o AWS Glue usa esse padrão para determinar a estrutura dos seus dados e mapeá-los em campos.
O AWS Glue fornece vários padrões integrados. Se preferir, você pode definir o seu próprio padrão. Você pode criar um padrão grok usando padrões integrados e personalizados na definição do seu classificador personalizado. Você pode adaptar um padrão grok para classificar formatos de arquivos de texto personalizados.
nota
Classificadores grok personalizados do AWS Glue usam a biblioteca de serialização GrokSerDe
para tabelas criadas no AWS Glue Data Catalog. Se você estiver usando o AWS Glue Data Catalog com o Amazon Athena, Amazon EMR ou Redshift Spectrum, verifique a documentação sobre esses serviços para obter informações sobre o suporte do GrokSerDe
. Atualmente, você pode encontrar problemas ao consultar tabelas criadas com o GrokSerDe
no Amazon EMR e Redshift Spectrum.
Veja a seguir a sintaxe básica dos componentes de um padrão grok:
%{PATTERN:field-name}
Os dados que correspondem ao PATTERN
nomeado são mapeados para a coluna field-name
no esquema, com um tipo de dados padrão de string
. Se preferir, o tipo de dados para o campo pode ser convertido em byte
, boolean
, double
, short
, int
, long
ou float
no esquema resultante.
%{PATTERN:field-name:data-type}
Por exemplo, para converter um campo num
para um tipo de dados int
, você pode usar esse padrão:
%{NUMBER:num:int}
Os padrões podem ser compostos por outros padrões. Por exemplo, você pode ter um padrão para um time stamp SYSLOG
que é definido por padrões de mês, dia e horário, como Feb 1 06:25:43
. Para esses dados, você pode definir o padrão a seguir:
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
nota
Os padrões grok podem processar somente uma linha por vez. Padrões de várias linhas não são compatíveis. Além disso, as quebras de linha dentro de um padrão não são compatíveis.
Valores personalizados para o classificador grok
Ao definir um classificador grok, forneça os seguintes valores para criar o classificador personalizado.
- Nome
-
Nome do classificador.
- Classificação
-
A string de texto que é escrita para explicar o formato dos dados que serão classificados, por exemplo,
special-logs
. - Padrão grok
-
O conjunto dos padrões que são aplicados ao armazenamento de dados para determinar se há uma correspondência. Esses são AWS Gluepadrões integrados do e todos os outros padrões personalizados que você definir.
Veja a seguir um exemplo de padrão grok.
%{TIMESTAMP_ISO8601:timestamp} \[%{MESSAGEPREFIX:message_prefix}\] %{CRAWLERLOGLEVEL:loglevel} : %{GREEDYDATA:message}
Quando os dados correspondem a
TIMESTAMP_ISO8601
, uma coluna de esquematimestamp
é criada. O comportamento é semelhante para os outros padrões nomeados no exemplo. - Padrões personalizados
-
Padrões personalizados opcionais que você define. Esses padrões são referenciados pelo padrão grok que classifica os seus dados. Você pode referenciar esses padrões personalizados no padrão grok aplicado aos seus dados. Cada padrão de componente personalizado deve estar em uma linha separada. A sintaxe de expressões regulares (regex)
é usada para definir o padrão. Veja a seguir um exemplo de uso dos padrões personalizados:
CRAWLERLOGLEVEL (BENCHMARK|ERROR|WARN|INFO|TRACE) MESSAGEPREFIX .*-.*-.*-.*-.*
O primeiro padrão nomeado personalizado,
CRAWLERLOGLEVEL
, é uma combinação quando os dados correspondem a uma das strings enumeradas. O segundo padrão personalizado,MESSAGEPREFIX
, tenta corresponder a uma string de prefixo de mensagem.
O AWS Glue rastreia o horário de criação, o horário da última atualização e a versão do seu classificador.
Padrões integrados
O AWS Glue fornece vários padrões comuns que você pode usar para criar um classificador personalizado. Você adiciona um padrão nomeado ao grok pattern
em uma definição de classificador.
A lista a seguir contém uma linha para cada padrão. Em cada linha, o nome do padrão é seguido da sua respectiva definição. A sintaxe de expressões 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)?)
Gravar classificadores XML personalizados
XML define a estrutura de um documento com o uso de tags no arquivo. Com um classificador XML personalizado, você pode especificar o nome de tag usado para definir uma linha.
Valores de classificador personalizados para um classificador XML
Ao definir um classificador XML, você fornece os seguintes valores para que o AWS Glue crie o classificador. O campo de classificação deste classificador é definido como xml
.
- Nome
-
Nome do classificador.
- Etiqueta de linha
-
O nome da tag XML que define uma linha de tabela no documento XML, sem colchetes angulares
< >
. O nome precisa estar em conformidade com as regras XML para tags.nota
O elemento que contém os dados da linha não pode ser um elemento vazio de fechamento automático. Por exemplo, esse elemento vazio não é analisado pelo AWS Glue:
<row att1=”xx” att2=”yy” />
Os elementos vazios podem ser escritos da seguinte forma:
<row att1=”xx” att2=”yy”> </row>
O AWS Glue rastreia o horário de criação, o horário da última atualização e a versão do seu classificador.
Por exemplo, digamos que você tenha o arquivo XML a seguir. Para criar uma tabela do AWS Glue que contenha apenas colunas para autor e título, crie um classificador no console do AWS Glue com Row tag (Tag de linha) como AnyCompany
. Em seguida, adicione e execute um crawler que use esse classificador 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>
Gravar classificadores JSON personalizados
JSON é um formato de intercâmbio de dados. Ele define estruturas de dados com pares de nome e valor ou uma lista de valores ordenada. Com um classificador JSON personalizado, você pode especificar o caminho JSON de uma estrutura de dados usada para definir o esquema da sua tabela.
Valores do classificador personalizado no AWS Glue
Ao definir um classificador JSON, você fornece os seguintes valores para que o AWS Glue crie esse classificador. O campo de classificação deste classificador é definido como json
.
- Nome
-
Nome do classificador.
- Caminho JSON
-
Um caminho JSON que aponta para um objeto usado para definir um esquema de tabela. O caminho JSON pode ser escrito na notação de pontos ou de colchetes. Os operadores a seguir são aceitos:
Operador Descrição $
Elemento raiz de um objeto JSON. Inicia todas as expressões de caminho *
Caracteres curinga. Disponíveis em qualquer lugar, um nome ou número são necessários no caminho JSON. .<name>
Filho com notação de pontos. Especifica um campo filho em um objeto JSON. ['<name>']
Filho com notação de colchetes. Especifica campo filho em um objeto JSON. Somente um único campo filho pode ser especificado. [<number>]
Índice de matriz. Especifica o valor de uma matriz por índice.
O AWS Glue rastreia o horário de criação, o horário da última atualização e a versão do seu classificador.
exemplo Usar um classificador JSON para extrair registros de uma matriz
Suponha que seus dados JSON sejam uma matriz de registros. Por exemplo, as primeiras linhas do seu arquivo podem ter a aparência a seguir:
[
{
"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"
}
]
Ao executar um crawler utilizando o classificador JSON integrado, o arquivo inteiro é usado para definir o esquema. Como você não especifica um caminho JSON, o crawler trata os dados como um objeto, ou seja, apenas uma matriz. Por exemplo, o esquema pode ser parecido com a seguinte:
root |-- record: array
No entanto, para criar um esquema baseado em cada registro da matriz JSON, crie um classificador JSON personalizado e especifique o caminho JSON como $[*]
. Quando você especifica esse caminho JSON, o classificador interroga todos os 12 registros na matriz para determinar o esquema. O esquema resultante contém campos separados para cada objeto, semelhante ao exemplo a seguir:
root |-- type: string |-- id: string |-- name: string
exemplo Usar um classificador JSON para examinar somente partes de um arquivo
Suponha que seus dados JSON sigam o padrão do arquivo JSON de exemplo s3://awsglue-datasets/examples/us-legislators/all/areas.json
obtido no site http://everypolitician.org/
{
"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"
}
Ao executar um crawler utilizando o classificador JSON integrado, o arquivo inteiro é usado para criar o esquema. Seu esquema poderá ser semelhante 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
No entanto, para criar um esquema usando apenas o objeto "id
", crie um classificador JSON personalizado e especifique o caminho JSON como $.id
. Em seguida, o esquema será baseado somente no campo "id
":
root |-- record: string
As primeiras linhas de dados extraídas com este esquema têm esta aparência:
{"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 criar um esquema baseado em um objeto altamente aninhado, como "identifier
", no arquivo JSON, você pode criar um classificador JSON personalizado e especificar o caminho JSON como $.identifiers[*].identifier
. Embora o esquema seja parecido com o exemplo anterior, ele é baseado em um objeto diferente no arquivo JSON.
O esquema é semelhante ao seguinte:
root |-- record: string
Listar as primeiras linhas de dados da tabela mostra que o esquema é baseado nos dados no 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 criar uma tabela com base em outro objeto altamente aninhado, como o campo "name
" na matriz "other_names
" do arquivo JSON, você pode criar um classificador JSON personalizado e especificar o caminho JSON como $.other_names[*].name
. Embora o esquema seja parecido com o exemplo anterior, ele é baseado em um objeto diferente no arquivo JSON. O esquema é semelhante ao seguinte:
root |-- record: string
Listar as primeiras linhas de dados na tabela mostra que isto esta baseado nos dados no objeto "name
" na 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": "আলাস্কা"}
Gravar classificadores CSV personalizados
Os classificadores CSV personalizados permitem que você especifique tipos de dados para cada coluna no campo de classificador CSV personalizado. É possível especificar o tipo de dados de cada coluna separando-o por uma vírgula. Ao especificar os tipos de dados, é possível substituir os tipos de dados inferidos dos crawlers e garantir que os dados sejam classificados adequadamente.
Você pode definir o SerDe para processamento de CSV no classificador, que será aplicado no catálogo de dados.
Ao criar um classificador personalizado, você também pode reutilizar o classificador para diferentes crawlers.
-
Para arquivos csv somente com cabeçalhos (sem dados), esses arquivos serão classificados como UNKNOWN (DESCONHECIDOS), pois não são fornecidas informações suficientes. Se você especificar que o CSV “tem cabeçalhos” na opção Column headings (Cabeçalhos das colunas) e fornecer os tipos de dados, poderemos classificar esses arquivos corretamente.
Você pode usar um classificador CSV personalizado para inferir o esquema de vários tipos de dados CSV. Os atributos personalizados que podem ser fornecidos ao classificador incluem delimitadores, uma opção de SerDe CSV, opções sobre o cabeçalho e se determinadas validações dos dados devem ser executadas.
Valores do classificador personalizado no AWS Glue
Ao definir um classificador CSV, você fornece os seguintes valores para que o AWS Glue crie esse classificador. O campo de classificação deste classificador é definido como csv
.
- Nome do classificador
-
Nome do classificador.
- SerDe CSV
-
Define o SerDe para processamento de CSV no classificador, que será aplicado no catálogo de dados. As opções são Open SerDe CSV, Lazy Simple SerDe e Nenhum. Você pode especificar o valor Nenhum quando quiser que o crawler faça a detecção.
- Delimitador de coluna
-
Um símbolo personalizado para indicar o que separa cada entrada de coluna na linha. Forneça um caractere Unicode. Se você não conseguir digitar seu delimitador, poderá copiá-lo e colá-lo. Isso funciona para caracteres imprimíveis, incluindo os que não são compatíveis com seu sistema (normalmente exibidos como □).
- Símbolo de cotação
-
Um símbolo personalizado para indicar o que combina o conteúdo em um único valor da coluna. Deve ser diferente do delimitador de coluna. Forneça um caractere Unicode. Se você não conseguir digitar seu delimitador, poderá copiá-lo e colá-lo. Isso funciona para caracteres imprimíveis, incluindo os que não são compatíveis com seu sistema (normalmente exibidos como □).
- Cabeçalhos de coluna
-
Indica o comportamento de como cabeçalhos de coluna devem ser detectados no arquivo CSV. Se o seu arquivo CSV personalizado tem cabeçalhos de coluna, insira uma lista de cabeçalhos de coluna delimitados por vírgula.
- Opções de processamento: permitir arquivos com uma única coluna
-
Habilita o processamento de arquivos que contêm apenas uma coluna.
- Opções de processamento: remover espaço em branco antes de identificar os valores de coluna
-
Especifica se os valores devem ser removidos antes de identificar o tipo dos valores de coluna.
- Tipos de dados personalizados: opcional
-
Insira o tipo de dados personalizado separado por uma vírgula. Especifica os tipos de dados personalizados no arquivo CSV. O tipo de dados personalizado deve ser um tipo de dados válido. Os tipos de dados válidos são: “BINARY”, “BOOLEAN”, “DATE”, “DECIMAL”, “DOUBLE”, “FLOAT”, “INT”, “LONG”, “SHORT”, “STRING”, “TIMESTAMP”. Tipos de dados inválidos exibirão um erro.