Apache Hive regEx serde:混合格式的正确正则表达式 (json)

Apache Hive regEx serde: proper regex for a mixed format (json)

我正在尝试使用 RegexSerDe 创建 AWS Athena table。由于一些导出问题,我无法使用 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/'

Error: HIVE_CURSOR_ERROR: Number of matching groups doesn't match the number of columns

我不是正则表达式方面的专家,所以会很有帮助。

谢谢和 BR。

试试正则表达式:(?<=")[^\"]*(?=\" *(?:,|}))

Demo

让这个工作可能会非常困难 - 即使您可以编写一个正则表达式来捕获 JSON 结构中的列,您能否保证所有 JSON 文档都将被呈现具有相同顺序的属性? JSON 本身认为 {"a": 1, "b": 2}{"b": 2, "a": 1} 是等价的,所以很多 JSON 库不保证,甚至不关心排序。

另一种方法是创建一个包含两列的 table:timestampdata,作为一个正则表达式 table 和一个包含两个捕获组的正则表达式,时间戳和该行的其余部分 - 或者可能作为 CSV table 如果时间戳后面的字符是制表符(如果它是 space 它将不起作用,因为 JSON 将包含 spaces):

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结构之间有一个space,根据需要更改它)。

table 本身用处不大,但您接下来可以创建一个视图,从 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 是带有 timestampdata 列的 table)

这会给你想要的东西,而且更不容易出错。