我试图使用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。
让这个工作变得非常困难 - 即使你可以编写一个可以从JSON结构中捕获列的正则表达式,你能保证所有JSON文档都将以相同的顺序呈现所有属性吗? JSON本身认为{"a": 1, "b": 2}
和{"b": 2, "a": 1}
是等价的,因此许多JSON库不保证,甚至不关心排序。
另一种方法是创建一个包含两列的表:timestamp
和data
,作为带有两个捕获组的正则表达式的正则表,时间戳和行的其余部分 - 或者如果时间戳后面的字符可能作为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
是与timestamp
和data
列的表)
这将为您提供您想要的东西,并且不会出错。
试试Regex:(?<=")[^\"]*(?=\" *(?:,|}))