我有一个存储JSON格式字符串的数据库列。字符串本身包含多个元素,如数组。每个元素包含多个键值对。一些值还可以包含多个键值对,例如,下面的"address“属性。
[{"name":"abc",
"address":{"street":"str1", "city":"c1"},
"phone":"1234567"
},
{"name":"def",
"address":{"street":"str2", "city":"c1"},
"phone":"7145895"
}
]我的最终目标是获得JSON字符串中每个字段的单个值。我可能会使用explode()来做这件事,但是explode()需要将数组传递给它,而不是字符串。因此,我的第一个目标是将JSON字符串转换为数组。有没有人能告诉我怎么做?非常感谢。
发布于 2016-09-28 10:29:48
您可以从以下内容开始:
select concat(‘{“name”’,data_json) from your_table q1 --re-construct your json
lateral view explode(split(json_data,’{“name”’)) json_splits as data_json --split json at each {"name" tag into array and then explode注意:我的代码没有测试,因为我目前没有访问hive的权限。这绝对会给你一个好的开始,或者你可以一直使用JSON com.cloudera.hive.serde.JSONSerDe的Hive SerDe
发布于 2016-09-28 12:52:30
正如@ruben123所建议的,特别是当你的JSON很复杂的时候,可以使用json的Hive SerDe。有几个可用的JSONSerDe,例如。com.cloudera.hive.serde.JSONSerDe,org.openx.data.jsonserde.JsonSerDe link
确保json格式正确,一行json对应一条记录。所以,你的json应该是:
{"name":"abc", "address":{"street":"str1", "city":"c1"}, "phone":"1234567"}
{"name":"def", "address":{"street":"str2", "city":"c1"}, "phone":"7145895"} 创建配置单元表:
CREATE TABLE sample_json (
name STRING,
address STRUCT<
street: STRING,
city: STRING>,
phone INT )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/your/hdfs/directory';要选择访问字段,只需
select name, address.street, address.city, phone from sample_json;
abc str1 c1 1234567
def str2 c1 7145895注意:如果尚未安装JSONSerDe,则必须运行ADD JAR
https://stackoverflow.com/questions/39732987
复制相似问题