【问题标题】:Can I get a Json Key into a Hive Column?我可以将 Json 密钥放入 Hive 列吗?
【发布时间】:2021-08-15 03:41:06
【问题描述】:

我正在尝试将 S3 中的 json 文件中的数据读取到我的 Hive 表中。如果列名和 json 键相同,则所有加载均正确。
但现在我想以嵌套 json 值进入特定列的方式读取数据(例如:for json

{"data1": {"key1": "value1"}}

我希望 data1.key1 值进入名为 data1_key1 的列;据我所知,SERDEPROPERTIES 可以实现这一点。

我的下一个问题是可以有多个 json 键,我希望键名是我的 Hive 表中的列值。

此外,根据这些键,进入其他列的键也会发生变化。

例如,我的 json 文件将是:

{"data1" : {"key1":"value1"}}

{"data2" : { "key2" : "value2"}}

这需要创建如下表:

col1 col2
数据1 值1
数据2值2

这可能吗?如果是应该怎么做?

【问题讨论】:

  • Hive 不支持动态列名。应该定义 Hive 表中的列。
  • @leftjoin:我同意。我们必须首先在不同的列中获取 data1 和 data2。然后将这些列中的json拆分成多列。

标签: json hive


【解决方案1】:

您可以使用正则表达式来做到这一点。将表 DDL 中的 json 列定义为字符串,并使用正则表达式对其进行解析。对您的数据示例进行了测试:

演示:

with your_table as ( --Replace this CTE with your table
select stack(2,
             '{"data1": {"key1": "value1"}}',
             '{"data2" : { "key2" : "value2"}}'
             ) as json
)

select regexp_extract(json,'^\\{ *\\"(\\w+)\\" *:', 1)    as col1, --capturing group 1 in a parenthesis START{spaces"(word)"spaces:
       regexp_extract(json,': *\\"(.+)\\" *\\} *\\}$', 1) as col2 --:spaces"(value characters)"spaces}spaces}END
  from your_table;

结果:

col1,col2
data1,value1
data2,value2

请阅读代码中的 cmets。您可以调整此解决方案以适合您的 JSON。这种方法允许在不知道其名称的情况下从 JSON 中提取键和值。 json_tupleget_json_object 在这种情况下不适用。

或者,您可以使用 regexSerDe 在 DDL 表中执行相同的操作,如以下答案:https://stackoverflow.com/a/47944328/2700344。对于 RegexSerDe 解决方案,您需要为每一列编写更复杂的单个正则表达式,其中包含一个捕获组(在括号中)。

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2016-10-04
    • 2011-02-17
    • 2011-02-10
    • 2012-07-09
    相关资源
    最近更新 更多