Grok SerDe - Amazon Athena

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Grok SerDe

Logstash Grok SerDe adalah perpustakaan dengan serangkaian pola khusus untuk deserialisasi data teks tidak terstruktur, biasanya log. Setiap pola Grok adalah ekspresi reguler bernama. Anda dapat mengidentifikasi dan menggunakan kembali pola deserialisasi ini sesuai kebutuhan. Ini membuatnya lebih mudah untuk menggunakan Grok dibandingkan dengan menggunakan ekspresi reguler. Grok menyediakan satu set pola yang telah ditentukan sebelumnya. Anda juga dapat membuat pola khusus.

Untuk menentukan Grok SerDe saat membuat tabel di Athena, gunakan ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' klausa, diikuti dengan klausa WITH SERDEPROPERTIES yang menentukan pola yang cocok dalam data Anda, di mana:

  • input.formatEkspresi mendefinisikan pola yang cocok dalam data. Hal ini diperlukan.

  • input.grokCustomPatternsEkspresi mendefinisikan pola kustom bernama, yang selanjutnya dapat Anda gunakan dalam input.format ekspresi. Ini opsional. Untuk menyertakan beberapa entri pola ke dalam input.grokCustomPatterns ekspresi, gunakan karakter escape baris baru (\n) untuk memisahkannya, sebagai berikut:. 'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')

  • OUTPUTFORMATKlausul STORED AS INPUTFORMAT dan diperlukan.

  • LOCATIONKlausa menentukan bucket Amazon S3, yang dapat berisi beberapa objek data. Semua objek data dalam bucket dideserialisasi untuk membuat tabel.

Contoh

Contoh-contoh ini bergantung pada daftar pola Grok yang telah ditentukan. Lihat pola yang telah ditentukan sebelumnya.

Contoh 1

Contoh ini menggunakan data sumber dari entri maillog Postfix yang disimpan di. s3://DOC-EXAMPLE-BUCKET/groksample/

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>

Pernyataan berikut membuat tabel di Athena dipanggil mygroktable dari sumber data, menggunakan pola kustom dan pola standar yang Anda tentukan:

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/';

Mulailah dengan pola sederhana, seperti%{NOTSPACE:column}, untuk mendapatkan kolom dipetakan terlebih dahulu dan kemudian mengkhususkan kolom jika diperlukan.

Contoh 2

Dalam contoh berikut, Anda membuat kueri untuk log Log4j. Contoh log memiliki entri dalam format ini:

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

Untuk menanyakan data log ini:

  • Tambahkan pola Grok ke input.format untuk setiap kolom. Misalnya, untuktimestamp, tambahkan%{TIMESTAMP_ISO8601:timestamp}. Untukloglevel, tambahkan%{LOGLEVEL:loglevel}.

  • Pastikan pola di input.format cocok dengan format log persis, dengan memetakan tanda hubung (-) dan koma yang memisahkan entri dalam format log.

    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/';

Contoh 3

Contoh kueri log Amazon S3 berikut menunjukkan 'input.grokCustomPatterns' ekspresi yang berisi dua entri pola, dipisahkan oleh karakter escape baris baru \n (), seperti yang ditunjukkan dalam cuplikan ini dari contoh kueri:. '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'