Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在配置单元列中获取Json密钥吗?_Json_Hive - Fatal编程技术网

我可以在配置单元列中获取Json密钥吗?

我可以在配置单元列中获取Json密钥吗?,json,hive,Json,Hive,我正在尝试将S3中json文件中的数据读取到配置单元表中。如果列名和json键相同,则会正确加载所有数据。但是现在我希望以这样一种方式读取数据,即嵌套的json值进入特定列(例如:For json) {"data1": {"key1": "value1"}} 我希望data1.key1值进入名为data1_key1的列;据我所知,使用serdeproperty可以实现这一点。我的下一个问题是可能存在多个json键,并且我希望键名是配置单元表中的列值 此外,根据这些键的不同,进入其他列的键也会发

我正在尝试将S3中json文件中的数据读取到配置单元表中。如果列名和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