Don*_*n P 4 sql arrays json hive explode
我有一个包含JSON对象的表.每个JSON对象在方括号中包含一个数组,以逗号分隔.
如何使用SQL访问方括号数组中的任何元素,例如"Matt"?
{"str":
[
1,
134,
61,
"Matt",
{"action.type":"registered","application":491,"value":423,"value2":12344},
["application"],
[],
"49:0"
]
}
Run Code Online (Sandbox Code Playgroud)
我在Hadoop上使用'Hive'.如果您知道如何在SQL中执行此操作,那很好:)
小智 5
您可以在Hive中执行以下操作:
首先,您需要一个JSON SerDe(串行器/解串器).我见过的功能最强大的是https://github.com/rcongiu/Hive-JSON-Serde/.Peter Sankauskas的SerDe似乎无法处理这种复杂的JSON.在撰写本文时,您需要使用Maven编译SerDe并将JAR放在Hive会话可以到达的位置.
接下来,您将需要更改您的JSON格式.原因是Hive采用强类型的数组视图,因此混合整数和其他东西是行不通的.考虑切换到这样的结构:
{"str": {
n1 : 1,
n2 : 134,
n3 : 61,
s1: "Matt",
st1: {"type":"registered","app":491,"value":423,"value2":12344},
ar1: ["application"],
ar2: [],
s2: "49:0"
} }
Run Code Online (Sandbox Code Playgroud)
接下来,您需要将JSON全部放在一行.我不确定这是Hive或SerDe的怪癖,但你需要这样做.
然后将数据复制到HDFS.
现在,您已准备好定义表并查询:
ADD JAR /path/to/jar/json-serde-1.1.2-jar-with-dependencies.jar;
CREATE EXTERNAL TABLE json (
str struct<
n1 : int, n2 : int, n3 : int,
s1 : string,
st1 : struct < type : string, app : int, value : int, value2 : int>,
ar1 : array<string>,
ar2 : array<string>,
s2 : string
>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/hdfs/path/to/file';
Run Code Online (Sandbox Code Playgroud)
有了这个,你可以运行有趣的嵌套查询,如:
select str.st1.type from json;
Run Code Online (Sandbox Code Playgroud)
最后但同样重要的是,因为这对于Hive来说非常具体,所以更新问题和标签是值得的.
| 归档时间: |
|
| 查看次数: |
5418 次 |
| 最近记录: |