Получить эту работу, вероятно, будет очень сложно - даже если вы можете написать регулярное выражение, которое будет захватывать столбцы из структуры 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
столбцы)
Это даст вам то, что вы хотите, и будет намного менее подвержено ошибкам.