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

问题描述 投票:0回答:2

我试图使用RegexSerDe创建一个AWS Athena表..由于一些导出问题,我无法使用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。

regex hive amazon-athena
2个回答
0
投票

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

另一种方法是创建一个包含两列的表:timestampdata,作为带有两个捕获组的正则表达式的正则表,时间戳和行的其余部分 - 或者如果时间戳后面的字符可能作为CSV表是一个选项卡(如果它是一个空格,它将无法工作,因为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是与timestampdata列的表)

这将为您提供您想要的东西,并且不会出错。


0
投票

试试Regex:(?<=")[^\"]*(?=\" *(?:,|}))

Demo

© www.soinside.com 2019 - 2024. All rights reserved.