

# Grok SerDe
<a name="grok-serde"></a>

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

## シリアル化ライブラリ名
<a name="library-name"></a>

Grok SerDe のシリアル化ライブラリ名は `com.amazonaws.glue.serde.GrokSerDe` です。

## Grok SerDe の使用方法
<a name="grok-serde-using"></a>

Athena でテーブルを作成するときに Grok SerDe を指定するには、`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 INPUTFORMAT` 句と `OUTPUTFORMAT` 句は必須です。
+ `LOCATION` 句は、Amazon S3 バケットを指定します。このバケットには、複数のデータオブジェクトを含めることができます。バケット内のすべてのデータオブジェクトが逆シリアル化されてテーブルが作成されます。

## 例
<a name="examples"></a>

このセクションの例は、Grok の定義済みパターンのリストに依存します。詳細については、GitHub.com の「[grok-patterns](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns)」を参照してください。

### 例 1
<a name="example-1"></a>

この例では、`s3://amzn-s3-demo-bucket/groksample/` に保存された 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://amzn-s3-demo-bucket/groksample/';
```

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

### 例 2
<a name="example-2"></a>

次の例では、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://amzn-s3-demo-bucket/samples/';
  ```

### 例 3
<a name="example-3"></a>

クエリ例のスニペット `'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')` に示すように、次の [Amazon S3 サーバー アクセス ログ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html) `CREATE TABLE` ステートメントの例には、改行エスケープ文字 (`\n`) で区切られた 2 つのパターンエントリが含まれる `'input.grokCustomPatterns'` 式が含まれています。

```
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://amzn-s3-demo-bucket'
```

## 以下も参照してください。
<a name="grok-serde-see-also"></a>
+ [Grok パターンについて](https://edgedelta.com/company/blog/what-are-grok-patterns) (外部ウェブサイト）
+ [組み込みパターン](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#classifier-builtin-patterns) (*AWS Glue ユーザーガイド*）