我可以在配置单元列中获取Json密钥吗?
我正在尝试将S3中json文件中的数据读取到配置单元表中。如果列名和json键相同,则会正确加载所有数据。我可以在配置单元列中获取Json密钥吗?,json,hive,Json,Hive,我正在尝试将S3中json文件中的数据读取到配置单元表中。如果列名和json键相同,则会正确加载所有数据。但是现在我希望以这样一种方式读取数据,即嵌套的json值进入特定列(例如:For json) {"data1": {"key1": "value1"}} 我希望data1.key1值进入名为data1_key1的列;据我所知,使用serdeproperty可以实现这一点。我的下一个问题是可能存在多个json键,并且我希望键名是配置单元表中的列值 此外,根据这些键的不同,进入其他列的键也会发
但是现在我希望以这样一种方式读取数据,即嵌套的json值进入特定列(例如:For json)
{"data1": {"key1": "value1"}}
我希望data1.key1
值进入名为data1_key1
的列;据我所知,使用serdeproperty
可以实现这一点。我的下一个问题是可能存在多个json键,并且我希望键名是配置单元表中的列值 此外,根据这些键的不同,进入其他列的键也会发生变化 例如,我的json文件将是:
{"data1" : {"key1":"value1"}}
或
这需要创建一个如下表:
col1 col2数据1值1
数据2值2
这可能吗?如果可能,应该如何做?您可以使用正则表达式来完成。将json列定义为表DDL中的字符串,并使用regexp对其进行解析。在您的数据示例中测试: 演示: 结果(见): 请阅读代码中的注释。您可以调整此解决方案以适合您的JSON。此方法允许从不知道名称的JSON中提取键和值。
JSON\u tuple
和get\u JSON\u object
在这种情况下不适用
或者,您也可以使用regexSerDe在DDL表中执行相同的操作,如以下回答:。对于regexSerDe解决方案,您需要编写包含一个捕获组的更复杂的单个regexp(在括号中)对于每一列。Hive不支持动态列名。应定义Hive表中的列。@leftjoin:我同意。我们必须首先在单独的列中获取data1和data2。然后将这些列中的json拆分为多个列。
{"data2" : { "key2" : "value2"}}
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