apache配置单元regex serde:适合混合格式(json)的正则表达式

wrrgggsh  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(203)

我试图创建一个aws雅典娜表使用regexserde。。由于一些导出问题,我不能使用jsonserde。 2019-04-11T09:05:16.775Z {"timestamp":"data0","level":"data1","thread":data2","logger":"data3","message":"data4","context":"data5"} 我试图用regex获取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/'

错误:配置单元\u光标\u错误:匹配组的数目与列的数目不匹配
我不是正则表达式的Maven,这对我会有很大的帮助。
谢谢,比尔。

jc3wubiy

jc3wubiy1#

要让它工作起来可能会非常困难- 即使您可以编写一个regex来捕获json结构中的列,您能保证所有json文档都以相同的顺序呈现属性吗?json本身考虑 {"a": 1, "b": 2} 以及 {"b": 2, "a": 1} 等价地,这么多json库不能保证,甚至不关心排序。
另一种方法是创建一个包含两列的表: timestamp 以及 data ,作为一个带有正则表达式的正则表达式表,正则表达式包含两个捕获组,时间戳和行的其余部分- 或者,如果时间戳后面的字符是一个制表符(如果是一个空格,它将不起作用,因为json将包含空格),则可能作为csv表:

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/'

(regex假设时间戳和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 这张table有table吗 timestamp 以及 data (列)
这会给你你想要的,而且会少很多错误。

ufj5ltwl

ufj5ltwl2#

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

相关问题