Создать таблицу для заданного формата c журнала в Афинах - PullRequest
0 голосов
/ 11 февраля 2020

Нужна помощь в создании схемы для приведенного ниже формата журнала. Я использую Athena для запроса нескольких журналов, которые имеют этот формат, но у меня проблема с созданием таблицы для этого указанного c формата журнала. Я попробовал пару разных попыток и потерпел неудачу. Ниже также приведена последняя попытка создания оператора таблицы, но она также продолжает сбой.

CREATE TABLE "fastly_logs" (
  "some_num" int,
  "timestamp1" timestamp,
  "cache_value" string,
  "some_fastly" string,  
  "log_info" struct <
                request_ipv4: string,    
                request_https: int,
                request: string,
                request_host: string,
                request_uri: string,
                http_code: int,
                response: int,
                req_header_size: int,
                req_body_size: int,
                resp_header_size: int,
                resp_body_size: int,
                content_type: string,
                pop: string,
                device_type: string,
                referrer: string,
                request_user_agent: string,
                info_state: string,
                hits: int,
                tls_version: string,
                >
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1',
  'input.regex' = '^\D(\d{3})\D (\d{4}-\d{2}-\d{2}T.*Z) (cache-\D+{3}+\d{4,10}) (Prod-fastly\D+\d{6}\D) {(.*)}'
)
LOCATION 's3://prod-fastly/'
TBLPROPERTIES ('has_encrypted_data'='true')

Формат журнала:

<134>2020-02-10T16:04:22Z cache-dca17767 Prod-fastly[476113]: {"timestamp":"Mon, 10 Feb 2020 16:04:22 GMT", "request_ipv4":"111.111.111.111", "request_https":"true", "tls_version":"TLSv1.2", "request":"POST", "request_host":"test.example.com", "vp_stem":"www", "request_uri":"/this/ajax-test", "http_code":200, "response":"OK", "req_header_size":1215, "req_body_size":54, "resp_header_size":916, "resp_body_size":16, "content_type":"application/json", "pop":"DCA", "device_type":"", "referrer":"https://test.example.copm/some/path", "request_user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36", "info_state":"PASS", "hits":0 }

1 Ответ

0 голосов
/ 13 февраля 2020

Я бы посоветовал не использовать \ D, если вы знаете, какие символы возможны. Для начала, до даты нет места, поэтому сразу не совпадает. Должно быть <(\d+)>

^\D(\d{3})\D

Ваша дата выглядит хорошо, но я не знаю, какой формат timestamp ожидает

(\d{4}-\d{2}-\d{2}T.*Z)

Кэш выглядит нормально, но значения кажутся шестнадцатеричными, поэтому вы должны использовать cache-[0-9a-fA-F]{1,13}, например

(cache-\D+{3}+\d{4,10})

Опять же, не используйте \ D. Было бы лучше go для Prod-fastly\[\d+\]

(Prod-fastly\D+\d{6}\D)

Все остальное - объект JSON, да, но вы не должны пытаться его анализировать, поэтому его тип должен быть строкой. И просто (.*)$ будет делать; не ставьте фигурные скобки

{(.*)}

И я бы рекомендовал использовать более одного пробела между полями

Всего

^<(\d+)>(\d{4}-\d{2}-\d{2}T.*Z)\s+(cache-[0-9a-fA-F]{1,13})\s+(Prod-fastly\[\d+\])\s+(.*)$

Вам нужно создать эту таблицу с открытым текстом, затем вы можете создать другую таблицу со структурой и проанализировать там объект json во время оператора вставки / выбора

CREATE TABLE "fastly_logs" (
  "some_num" int,
  "timestamp1" timestamp,
  "cache_value" string,
  "some_fastly" string,  
  "remainder" string)

Затем попробуйте что-то вроде

SELECT json extract(remainder, "$.request_host") FROM fastly_logs;

...