メニュー
Amazon Athena
ユーザーガイド

Grok SerDe

Logstash Grok SerDe は、構造化されていないテキストファイル (通常はログ) の逆シリアル化専用のパターンセットで構成されるライブラリです。各 Grok パターンは名前付きの正規表現です。必要に応じて、これらの逆シリアル化パターンを特定し、再利用できます。このため、正規表現を使用するよりも Grok を使用するほうが簡単です。Grok は、定義済みパターンのセットを提供します。カスタムパターンを作成することもできます。

Athena でテーブルを作成するときに Grok SerDe を指定するには、ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' 句に続けて WITH SERDEPROPERTIES 句を使用し、データでマッチさせるパターンを指定します。

  • input.format 式は、データファイルでマッチさせるパターンを定義します。この値は必須です。

  • input.grokCustomPatterns 式は、カスタムの名前付きパターンを定義します。後で、このパターンを input.format 式内で使用できます。これは省略可能です。

  • STORED AS INPUTFORMAT 句と OUTPUTFORMAT 句は必須です。

  • LOCATION 句は、Amazon S3 バケットを指定します。このバケットには、複数のソースデータファイルを含めることができます。バケット内のすべてのファイルが逆シリアル化されてテーブルが作成されます。

以下の例は、Grok の定義済みパターンのリストに依存します。「定義済みパターン」を参照してください。

例 1

次の例では、s3://mybucket/groksample に保存されている 1 つの架空のテキストファイルを使用します。このファイル内のデータは、Postfix のメールログのエントリを表します。

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>

次のステートメントでは、指定したカスタムパターンと定義済みパターンを使用して、ソースデータファイルから mygroktable というテーブルを Athena で作成します。

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://mybucket/groksample';

%{NOTSPACE:column} などのシンプルなパターンから始め、最初に列をマッピングし、次に必要に応じて列を特化します。

例 2

次の例では、Log4j ログのクエリを作成します。ログファイル例には、次の形式のエントリが含まれています。

2017-09-12 12:10:34,972 INFO - processType=AZ, processId=ABCDEFG614B6F5E49, status=RUN, threadId=123:amqListenerContainerPool23[P: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://mybucket/samples/';

このページの内容: