Apache Hive RegEx Serde: правильное регулярное выражение для смешанного формата (JSON) - PullRequest
0 голосов
/ 11 апреля 2019

я пытаюсь создать таблицу AWS Athena с помощью RegexSerDe .. из-за некоторых проблем с экспортом я не могу использовать JsonSerDe.

2019-04-11T09:05:16.775Z {"timestamp":"data0","level":"data1","thread":data2","logger":"data3","message":"data4","context":"data5"}

Я пытался получить значения JSON с помощью регулярного выражения, но безуспешно.

CREATE EXTERNAL TABLE IF NOT EXISTS dsfsdfs.mecs3(
  `timestamp` string,
  `level` string,
  `thread` string,
  `logger` string,
  `message` string,
  `context` string 
)
)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
 "input.regex" = "[ :]+(\\"[^\"]*\\")"
)LOCATION 's3://thisisates/'

Ошибка: HIVE_CURSOR_ERROR: количество подходящих групп не соответствует количество столбцов

Было бы здорово помочь, поскольку я не эксперт в регулярных выражениях.

Спасибо и BR.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Получить эту работу, вероятно, будет очень сложно - даже если вы можете написать регулярное выражение, которое будет захватывать столбцы из структуры JSON, можете ли вы гарантировать, что все документы JSON будут отображаться со свойствами в том же порядке?Сам JSON считает {"a": 1, "b": 2} и {"b": 2, "a": 1} эквивалентными, поэтому многие библиотеки JSON не гарантируют или даже не заботятся о порядке.

Другой подход к этому - создать таблицу с двумя столбцами: timestamp и data, как таблица регулярных выражений с регулярным выражением с двумя группами захвата, временной меткой и остальной частью строки - или, возможно, как таблица CSV, если символ после временной метки является вкладкой (если это пробел, который он выиграл 't работает, поскольку JSON будет содержать пробелы):

CREATE EXTERNAL TABLE IF NOT EXISTS mecs3_raw (
  `timestamp` string,
  `data` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "^(\\S+) (.+)$"
)
LOCATION 's3://thisisates/'

(регулярное выражение предполагает наличие пробела между меткой времени и структурой JSON, при необходимости измените его).

Эта таблицасамо по себе не очень удобно, но вы можете создать представление, извлекающее свойства из структуры JSON:

CREATE VIEW mecs3 AS
SELECT
  "timestamp",
  JSON_EXTRACT_SCALAR("data", '$.level') AS level,
  JSON_EXTRACT_SCALAR("data", '$.thread') AS thread,
  JSON_EXTRACT_SCALAR("data", '$.logger') AS logger,
  JSON_EXTRACT_SCALAR("data", '$.message') AS message,
  JSON_EXTRACT_SCALAR("data", '$.context') AS context
FROM mecs3_raw

(mecs3_raw - это таблица с timestamp и data столбцы)

Это даст вам то, что вы хотите, и будет намного менее подвержено ошибкам.

0 голосов
/ 11 апреля 2019

Попробуйте Regex: (?<=")[^\"]*(?=\" *(?:,|}))

Демо

...