【问题标题】:Apache Hive regEx serde: proper regex for a mixed format (json)Apache Hive regEx serde:混合格式(json)的正确正则表达式
【发布时间】:2019-04-11 14:48:20
【问题描述】:

我正在尝试使用 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


    【解决方案1】:

    完成这项工作可能会非常困难 - 即使您可以编写一个从 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 列的表)

    这将为您提供您想要的,并且更不容易出错。

    【讨论】:

    • 这对我的问题来说是一个非常好的解决方案,这是有效的 -> "input.regex" = "^(\\S+) (.+)$"
    • 如果您发现我的解决方案有帮助,请考虑将其标记为已接受的答案并点赞。我修复了您指出的转义问题。
    【解决方案2】:

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

    Demo

    【讨论】:

    • 同样的问题 HIVE_CURSOR_ERROR:匹配组的数量与列的数量不匹配
    • 在 json 字符串中 data2 之前缺少一个 "。这是一个问题。如果可以解决,请尝试this regex。
    猜你喜欢
    • 2023-03-17
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多