GROK SerDe - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

GROK SerDe

Logstash Grok SerDe 是一個庫,具有一組用於反序列化非結構化文本數據的專門模式,通常是日誌。每個 Grok 模式是具名的規則表達式。您可以視需要識別和重複使用這些還原序列化模式。相較於使用規則表達式,這可讓您更輕鬆地使用 Grok。Grok 提供一組預先定義的模式。您也可以建立自訂模式。

若要在 Athena 中建立資料表 SerDe 時指定 Grok,請使用ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe'子句,後面接著指定要在資料中比對之模式的WITH SERDEPROPERTIES子句,其中:

  • input.format 表達式定義資料中要符合的模式。這是必要的。

  • input.grokCustomPatterns 表達式定義具名的自訂模式,供您後續在 input.format 表達式內使用。這是選用的。若要將多個模式項目併入 input.grokCustomPatterns 表達式中,請使用新行逸出字元 (\n) 來分隔,如下所示: 'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')

  • STORED AS INPUTFORMATOUTPUTFORMAT 子句是必要的。

  • LOCATION 子句會指定 Amazon S3 儲存貯體,其可以包含多個資料物件。儲存貯體中的所有資料物件都還原序列化來建立資料表。

範例

這些範例倚賴預先定義的 Grok 模式清單。請參閱預先定義的模式

範例 1

此範例使用 s3://DOC-EXAMPLE-BUCKET/groksample/ 中儲存的 Postfix maillog 項目內的來源資料。

Feb 9 07:15:00 m4eastmail postfix/smtpd[19305]: B88C4120838: connect from unknown[192.168.55.4] Feb 9 07:15:00 m4eastmail postfix/smtpd[20444]: B58C4330038: client=unknown[192.168.55.4] Feb 9 07:15:03 m4eastmail postfix/cleanup[22835]: BDC22A77854: message-id=<31221401257553.5004389LCBF@m4eastmail.example.com>

以下陳述式使用自訂模式和您指定的預先定義模式,在 Athena 中從來源資料建立名為 mygroktable 的資料表:

CREATE EXTERNAL TABLE `mygroktable`( syslogbase string, queue_id string, syslog_message string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.grokCustomPatterns' = 'POSTFIX_QUEUEID [0-9A-F]{7,12}', 'input.format'='%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/groksample/';

首先使用簡單模式,例如 %{NOTSPACE:column},先映射欄,再視需要將欄特殊化。

範例 2

在下列範例中,您為 Log4j 日誌建立查詢。範例日誌中的項目採用此格式:

2017-09-12 12:10:34,972 INFO - processType=AZ, processId=ABCDEFG614B6F5E49, status=RUN, threadId=123:amqListenerContainerPool23P:AJ|ABCDE9614B6F5E49||2017-09-12T12:10:11.172-0700], executionTime=7290, tenantId=12456, userId=123123f8535f8d76015374e7a1d87c3c, shard=testapp1, jobId=12312345e5e7df0015e777fb2e03f3c, messageType=REAL_TIME_SYNC, action=receive, hostname=1.abc.def.com

查詢此日誌資料:

  • 針對每個欄,將 Grok 模式新增到 input.format。例如,對於 timestamp,新增 %{TIMESTAMP_ISO8601:timestamp}。對於 loglevel,新增 %{LOGLEVEL:loglevel}

  • 映射在日誌格式中用於分隔項目的虛線 (-) 和逗號,以確定 input.format 中的模式完全符合日誌的格式。

    CREATE EXTERNAL TABLE bltest ( timestamp STRING, loglevel STRING, processtype STRING, processid STRING, status STRING, threadid STRING, executiontime INT, tenantid INT, userid STRING, shard STRING, jobid STRING, messagetype STRING, action STRING, hostname STRING ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( "input.grokCustomPatterns" = 'C_ACTION receive|send', "input.format" = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} - processType=%{NOTSPACE:processtype}, processId=%{NOTSPACE:processid}, status=%{NOTSPACE:status}, threadId=%{NOTSPACE:threadid}, executionTime=%{POSINT:executiontime}, tenantId=%{POSINT:tenantid}, userId=%{NOTSPACE:userid}, shard=%{NOTSPACE:shard}, jobId=%{NOTSPACE:jobid}, messageType=%{NOTSPACE:messagetype}, action=%{C_ACTION:action}, hostname=%{HOST:hostname}" ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/samples/';

範例 3

以下查詢 Amazon S3 日誌的範例顯示 'input.grokCustomPatterns' 表達式,其中包含兩個以新行逸出字元 (\n) 來分隔的模式項目,如查詢範例中的這個片段所示:'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')

CREATE EXTERNAL TABLE `s3_access_auto_raw_02`( `bucket_owner` string COMMENT 'from deserializer', `bucket` string COMMENT 'from deserializer', `time` string COMMENT 'from deserializer', `remote_ip` string COMMENT 'from deserializer', `requester` string COMMENT 'from deserializer', `request_id` string COMMENT 'from deserializer', `operation` string COMMENT 'from deserializer', `key` string COMMENT 'from deserializer', `request_uri` string COMMENT 'from deserializer', `http_status` string COMMENT 'from deserializer', `error_code` string COMMENT 'from deserializer', `bytes_sent` string COMMENT 'from deserializer', `object_size` string COMMENT 'from deserializer', `total_time` string COMMENT 'from deserializer', `turnaround_time` string COMMENT 'from deserializer', `referrer` string COMMENT 'from deserializer', `user_agent` string COMMENT 'from deserializer', `version_id` string COMMENT 'from deserializer') ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.format'='%{NOTSPACE:bucket_owner} %{NOTSPACE:bucket} \\[%{INSIDE_BRACKETS:time}\\] %{NOTSPACE:remote_ip} %{NOTSPACE:requester} %{NOTSPACE:request_id} %{NOTSPACE:operation} %{NOTSPACE:key} \"?%{INSIDE_QS:request_uri}\"? %{NOTSPACE:http_status} %{NOTSPACE:error_code} %{NOTSPACE:bytes_sent} %{NOTSPACE:object_size} %{NOTSPACE:total_time} %{NOTSPACE:turnaround_time} \"?%{INSIDE_QS:referrer}\"? \"?%{INSIDE_QS:user_agent}\"? %{NOTSPACE:version_id}', 'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET'