Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Schreiben von benutzerdefinierten Klassifikatoren für verschiedene Datenformate
Sie können einen angepassten Classifier bereitstellen, um Ihre Daten in AWS Glue zu klassifizieren. Sie können einen benutzerdefinierten Klassifikator mithilfe eines Grok-Musters, eines XML Tags, einer JavaScript Objektnotation (JSON) oder durch Kommas getrennten Werten () erstellen. CSV Ein AWS Glue-Crawler kann benutzerdefinierten Classifier aufrufen. Wenn der Classifier die Daten erkennt, gibt er die Klassifizierung und das Schema der Daten an den Crawler zurück. Möglicherweise müssen Sie einen angepassten Classifier definieren, wenn Ihre Daten nicht mit den integrierten Classifiern übereinstimmen oder wenn Sie die vom Crawler erstellten Tabellen anpassen möchten.
Weitere Informationen zur Erstellung eines Classifiers mit der AWS Glue-Konsole finden Sie unter Klassifikatoren mit der AWS Glue Konsole erstellen.
AWS Glue führt angepasste Classifier vor integrierten Classifiern in der von Ihnen angegebenen Reihenfolge aus. Wenn ein Crawler einen Classifier findet, der zu den Daten passt, werden die Klassifizierungszeichenkette und das Schema für die Definition von Tabellen verwendet, die in Ihren AWS Glue Data Catalog geschrieben werden.
Themen
Angepasste Grok-Classifier schreiben
Grok ist ein Werkzeug, das verwendet wird, um Textdaten über ein passendes Muster zu analysieren. Ein Grok-Muster ist ein benannter Satz von regulären Ausdrücken (regex), die verwendet werden, um Daten zeilenweise abzugleichen. AWS Glue verwendet Grok-Muster, um das Schema Ihrer Daten herzuleiten. Wenn ein Grok-Muster mit Ihren Daten übereinstimmt, verwendet AWS Glue das Muster, um die Struktur Ihrer Daten zu bestimmen und Feldern zuzuordnen.
AWS Glue stellt viele integrierte Muster bereit. Sie können außerdem Ihre eigenen definieren. Sie können ein Grok-Muster mit Hilfe von integrierten Mustern und angepassten Mustern in Ihrer angepassten Classifier-Definition erstellen. Sie können ein Grok-Muster anpassen, um spezielle Textdateiformate zu klassifizieren.
Anmerkung
Benutzerdefinierte AWS Glue-Grok-Classifier verwenden die GrokSerDe
Serialisierungsbibliothek für Tabellen, die im AWS Glue Data Catalog erstellt wurden. Wenn Sie das AWS Glue Data Catalog mit Amazon Athena, Amazon EMR oder Redshift Spectrum verwenden, finden Sie in der Dokumentation zu diesen Diensten Informationen zur Unterstützung von. GrokSerDe
Derzeit können Probleme bei der Abfrage GrokSerDe
von Tabellen auftreten, die mit Amazon EMR und Redshift Spectrum erstellt wurden.
Im Folgenden wird die grundlegende Syntax für die Komponenten eines Grok-Musters beschrieben:
%{PATTERN:field-name}
Daten, die mit dem benannten PATTERN
übereinstimmen, werden der field-name
-Spalte im Schema zugeordnet. Sie erhalten den Standarddatentyp string
. Optional kann der Datentyp für das Feld als byte
, boolean
, double
, short
, int
, long
oder float
in das resultierende Schema übernommen werden.
%{PATTERN:field-name:data-type}
Um z. B. ein num
-Feld auf einen int
-Datentyp festzulegen, können Sie das folgende Muster verwenden:
%{NUMBER:num:int}
Muster können aus anderen Mustern zusammengesetzt werden. Sie können z. B. ein Muster für einen SYSLOG
-Zeitstempel verwenden, das durch Muster für Monat, Tag des Monats und Uhrzeit definiert ist (beispielsweise Feb 1 06:25:43
). Für diese Daten können Sie das folgende Muster definieren:
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
Anmerkung
Grok-Muster können immer nur eine Zeile auf einmal verarbeiten. Mehrzeilige Muster werden nicht unterstützt. Auch Zeilenumbrüche innerhalb eines Musters werden nicht unterstützt.
Benutzerdefinierte Werte für den Grok-Klassifikator
Wenn Sie einen Grok-Klassifikator definieren, geben Sie die folgenden Werte an, um den benutzerdefinierten Klassifikator zu erstellen.
- Name
-
Name des Classifiers.
- Klassifizierung
-
Die Zeichenfolge, die geschrieben wird, um das Format der klassifizierten Daten zu beschreiben (z. B.
special-logs
). - Grok-Muster
-
Die Menge von Mustern, die auf die Datenspeicher angewendet werden, um festzustellen, ob es eine Übereinstimmung gibt. Diese Muster stammen aus integrierten Mustern in AWS Glue und beliebigen, von Ihnen definierten angepassten Mustern.
Im Folgenden sehen Sie ein Beispiel für ein Grok-Muster:
%{TIMESTAMP_ISO8601:timestamp} \[%{MESSAGEPREFIX:message_prefix}\] %{CRAWLERLOGLEVEL:loglevel} : %{GREEDYDATA:message}
Wenn die Daten mit
TIMESTAMP_ISO8601
übereinstimmen, wird eine Schema-Spaltetimestamp
erzeugt. Das Verhalten ist für die anderen benannten Muster im Beispiel ähnlich. - Benutzerdefinierte Muster
-
Von Ihnen definierte, optionale Muster. Diese Muster werden durch das Grok-Muster referenziert, das Ihre Daten klassifiziert. Sie können diese angepassten Muster in dem Grok-Muster referenzieren, das auf Ihre Daten angewendet wird. Jedes angepasste Komponentenmuster muss sich in einer separaten Zeile befinden. Die Syntax für reguläre Ausdrücke (regex)
wird verwendet, um das Muster zu definieren. Im Folgenden finden Sie ein Beispiel für die Verwendung von angepassten Mustern:
CRAWLERLOGLEVEL (BENCHMARK|ERROR|WARN|INFO|TRACE) MESSAGEPREFIX .*-.*-.*-.*-.*
Das erste angepasste benannte Muster (
CRAWLERLOGLEVEL
) ist eine Übereinstimmung, wenn die Daten mit einer der aufgezählten Zeichenfolgen übereinstimmen. Das zweite benutzerdefinierte Muster (MESSAGEPREFIX
) versucht, eine Nachrichtenpräfix-Zeichenfolge zu finden.
AWS Glue verfolgt die Erstellungszeit, die letzte Aktualisierungszeit und die Version Ihres Classifiers.
Integrierte Muster
AWS Glue bietet viele gängige Muster, die Sie zum Erstellen eines angepassten Classifiers verwenden können. Sie fügen dem grok pattern
in einer Classifier-Definition ein benanntes Muster hinzu.
Die folgende Liste umfasst einer Zeile für jedes Muster. Pro Zeile folgt nach der Definition der Name des Musters. Die Syntax für reguläre Ausdrücke (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)?)
Schreiben von XML benutzerdefinierten Klassifikatoren
XMLdefiniert die Struktur eines Dokuments mithilfe von Tags in der Datei. Mit einem XML benutzerdefinierten Klassifikator können Sie den Tagnamen angeben, der zur Definition einer Zeile verwendet wird.
Benutzerdefinierte Klassifiziererwerte für einen Klassifikator XML
Wenn Sie einen XML Klassifikator definieren, geben Sie die folgenden Werte an, um den Klassifikator AWS Glue zu erstellen. Das Klassifizierungsfeld dieses Classifiers ist auf xml
festgelegt.
- Name
-
Name des Classifiers.
- Row-Tag
-
Der XML Tagname, der eine Tabellenzeile im XML Dokument definiert, ohne spitze Klammern.
< >
Der Name muss den XML Regeln für ein Tag entsprechen.Anmerkung
Das Element, das die Zeilendaten enthält, darf kein selbstschließendes, leeres Element sein. Dieses leere Element wird beispielsweise nicht von AWS Glue analysiert:
<row att1=”xx” att2=”yy” />
Leere Elemente können wie folgt geschrieben werden:
<row att1=”xx” att2=”yy”> </row>
AWS Glue verfolgt die Erstellungszeit, die letzte Aktualisierungszeit und die Version Ihres Classifiers.
Nehmen wir zum Beispiel an, Sie haben die folgende XML Datei. Zum Erstellen einer AWS Glue-Tabelle, die nur Spalten für Autor und Titel enthält, generieren Sie einen Classifier in der AWS Glue-Konsole mit Row tag (Zeilen-Tag) als AnyCompany
. Fügen Sie dann einen Crawler hinzu, der den benutzerdefinierten Classifier verwendet, und führen Sie ihn aus.
<?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>
JSONBenutzerdefinierte Klassifikatoren schreiben
JSONist ein Datenaustauschformat. Es definiert Datenstrukturen mit Name-Wert-Paaren oder einer geordneten Liste von Werten. Mit einem JSON benutzerdefinierten Klassifikator können Sie den JSON Pfad zu einer Datenstruktur angeben, die zur Definition des Schemas für Ihre Tabelle verwendet wird.
Angepasste Classifier-Werte in AWS Glue
Wenn Sie einen JSON Klassifikator definieren, geben Sie die folgenden Werte an, um den Klassifikator AWS Glue zu erstellen. Das Klassifizierungsfeld dieses Classifiers ist auf json
festgelegt.
- Name
-
Name des Classifiers.
- JSONPfad
-
Ein JSON Pfad, der auf ein Objekt verweist, das zur Definition eines Tabellenschemas verwendet wird. Der JSON Pfad kann in Punkt- oder Klammerschreibweise geschrieben werden. Folgende Operatoren werden unterstützt:
Operator Beschreibung $
Stammelement eines JSON Objekts. Beginn für alle Pfadausdrücke *
Platzhalterzeichen. Verfügbar überall dort, wo ein Name oder eine Zahl im JSON Pfad erforderlich ist. .<name>
Untergeordnetes Element in Punkt-Notation. Gibt ein untergeordnetes Feld in einem JSON Objekt an. ['<name>']
Untergeordnetes Element in Klammer-Notation. Gibt ein untergeordnetes Feld in einem JSON Objekt an. Es kann nur ein einziges untergeordnetes Feld angegeben werden. [<number>]
Array-Index. Gibt den Wert eines Arrays über den Index an.
AWS Glue verfolgt die Erstellungszeit, die letzte Aktualisierungszeit und die Version Ihres Classifiers.
Beispiel Verwendung eines JSON Klassifikators zum Abrufen von Datensätzen aus einem Array
Angenommen, Ihre JSON Daten sind ein Array von Datensätzen. Die ersten paar Zeilen Ihrer Datei könnten beispielsweise wie folgt aussehen:
[ { "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" } ]
Wenn Sie einen Crawler mit dem integrierten JSON Klassifikator ausführen, wird die gesamte Datei zur Definition des Schemas verwendet. Da Sie keinen JSON Pfad angeben, behandelt der Crawler die Daten als ein Objekt, also nur als Array. Das Schema kann beispielsweise wie folgt aussehen:
root |-- record: array
Um jedoch ein Schema zu erstellen, das auf jedem Datensatz im JSON Array basiert, erstellen Sie einen benutzerdefinierten JSON Klassifikator und geben Sie den JSON Pfad als an. $[*]
Wenn Sie diesen JSON Pfad angeben, fragt der Classifier alle 12 Datensätze im Array ab, um das Schema zu ermitteln. Das resultierende Schema enthält für jedes Objekt eigene Felder, wie im folgenden Beispiel gezeigt:
root |-- type: string |-- id: string |-- name: string
Beispiel Verwenden Sie einen JSON Klassifikator, um nur Teile einer Datei zu untersuchen
Angenommen, Ihre JSON Daten folgen dem Muster der JSON Beispieldatei s3://awsglue-datasets/examples/us-legislators/all/areas.json
aus 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" }
Wenn Sie einen Crawler mit dem integrierten JSON Klassifikator ausführen, wird die gesamte Datei zur Erstellung des Schemas verwendet. Es könnte das folgende Schema erstellt werden:
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
Um jedoch ein Schema zu erstellen, das nur das Objekt "id
" verwendet, erstellen Sie einen benutzerdefinierten JSON Klassifikator und geben Sie den JSON Pfad als an. $.id
Dann basiert das Schema nur auf dem Feld "id
":
root |-- record: string
Die ersten paar mit diesem Schema extrahierten Datenzeilen sehen so aus:
{"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"}
Um ein Schema zu erstellen, das auf einem tief verschachtelten Objekt wie "identifier
“ in der JSON Datei basiert, können Sie einen benutzerdefinierten JSON Klassifikator erstellen und den JSON Pfad als angeben. $.identifiers[*].identifier
Obwohl das Schema dem vorherigen Beispiel ähnelt, basiert es auf einem anderen Objekt in der JSON Datei.
Das Schema sieht wie folgt aus:
root |-- record: string
Die ersten Datenzeilen aus der Tabelle zeigen, dass das Schema auf den Daten im Objekt "identifier
" basiert:
{"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"}
Um eine Tabelle zu erstellen, die auf einem anderen tief verschachtelten Objekt basiert, z. B. dem Feld name
"" im Array other_names
"" in der JSON Datei, können Sie einen benutzerdefinierten JSON Klassifikator erstellen und den JSON Pfad als angeben. $.other_names[*].name
Obwohl das Schema dem vorherigen Beispiel ähnelt, basiert es auf einem anderen Objekt in der JSON Datei. Das Schema sieht wie folgt aus:
root |-- record: string
Die ersten Datenzeilen aus der Tabelle zeigen, dass das Schema auf den Daten im Objekt "name
" im Array "other_names
" basiert:
{"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": "আলাস্কা"}
Schreiben von CSV benutzerdefinierten Klassifikatoren
Mit benutzerdefinierten CSV Klassifikatoren können Sie Datentypen für jede Spalte im benutzerdefinierten CSV-Klassifikatorfeld angeben. Sie können den Datentyp jeder Spalte durch ein Komma trennen. Durch die Angabe von Datentypen können Sie die vom Crawler abgeleiteten Datentypen überschreiben und sicherstellen, dass die Daten entsprechend klassifiziert werden.
Sie können das SerDe für die Verarbeitung CSV im Klassifikator festlegen, der im Datenkatalog angewendet wird.
Wenn Sie einen benutzerdefinierten Klassifikator erstellen, können Sie den Classifer auch für verschiedene Crawler wiederverwenden.
-
Bei CSV-Dateien, die nur Kopfzeilen (keine Daten) enthalten, werden diese Dateien als klassifiziert, UNKNOWN da nicht genügend Informationen bereitgestellt werden. Wenn Sie in der Option CSV „Spaltenüberschriften“ die Option „Hat Überschriften“ angeben und die Datentypen angeben, können wir diese Dateien korrekt klassifizieren.
Sie können einen benutzerdefinierten CSV Klassifikator verwenden, um das Schema verschiedener Datentypen abzuleiten. CSV Zu den benutzerdefinierten Attributen, die Sie für Ihren Klassifikator angeben können, gehören Trennzeichen, eine CSV SerDe Option, Optionen für den Header und die Angabe, ob bestimmte Validierungen an den Daten durchgeführt werden sollen.
Angepasste Classifier-Werte in AWS Glue
Wenn Sie einen CSV Klassifikator definieren, geben Sie die folgenden Werte an, um den Klassifikator zu erstellen. AWS Glue Das Klassifizierungsfeld dieses Classifiers ist auf csv
festgelegt.
- Name des Classifiers
-
Name des Classifiers.
- CSVSerde
-
Legt den SerDe Wert für die Verarbeitung CSV im Klassifikator fest, der im Datenkatalog angewendet wird. Die Optionen sind Open CSV SerDe, Lazy SerDe Simple und Keine. Sie können den Wert „None“ angeben, wenn der Crawler die Erkennung durchführen soll.
- Spaltentrennzeichen
-
Eine benutzerdefiniertes Symbol zur Bezeichnung, wodurch die einzelnen Spalteneinträge in der Zeile voneinander getrennt werden. Geben Sie ein Unicode-Zeichen an. Wenn Sie Ihr Trennzeichen nicht eingeben können, können Sie es kopieren und einfügen. Dies funktioniert für druckbare Zeichen, einschließlich solcher, die Ihr System nicht unterstützt (normalerweise angezeigt als □).
- Anführungszeichen
-
Ein benutzerdefiniertes Symbol zur Bezeichnung, wodurch Inhalte zu einem einzelnen Spaltenwert miteinander kombiniert werden. Muss sich von dem Spaltentrennzeichen unterscheiden. Geben Sie ein Unicode-Zeichen an. Wenn Sie Ihr Trennzeichen nicht eingeben können, können Sie es kopieren und einfügen. Dies funktioniert für druckbare Zeichen, einschließlich solcher, die Ihr System nicht unterstützt (normalerweise angezeigt als □).
- Spaltenüberschriften
-
Gibt an, wie Spaltenüberschriften in der CSV Datei erkannt werden sollen. Wenn Ihre benutzerdefinierte CSV Datei Spaltenüberschriften enthält, geben Sie eine durch Kommas getrennte Liste der Spaltenüberschriften ein.
- Verarbeitungsoptionen: Dateien mit einzelnen Spalte erlauben
-
Aktiviert die Verarbeitung von Dateien, die nur eine Spalte enthalten.
- Verarbeitungsoptionen: Leerzeichen vor Identifizierung von Spaltenwerten abtrennen
-
Gibt an, ob Werte vor dem Identifizieren des Typ der Spaltenwerte abgetrennt werden sollen.
- Benutzerdefinierte Datentypen – optional
-
Geben Sie den benutzerdefinierten Datentyp durch ein Komma getrennt ein. Gibt die benutzerdefinierten Datentypen in der Datei an. CSV Der benutzerdefinierte Datentyp muss ein unterstützter Datentyp sein. Unterstützte Datentypen sind: „BINARY“, „“, „BOOLEAN“, „DATE“, „DECIMAL“, „DOUBLE“, „FLOAT“, „“, „INT“, „LONG“, „SHORT“, „STRING“. TIMESTAMP Bei nicht unterstützten Datentypen wird ein Fehler angezeigt.