您可以在 Hive 中执行此操作,如下所示:
首先你需要一个 JSON SerDe (Serializer / Deserializer)。我见过的最实用的是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"
} }
接下来,您需要将 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';
有了这个,您可以运行有趣的嵌套查询,例如:
select str.st1.type from json;
最后但并非最不重要的一点是,因为这是 Hive 特有的,所以值得更新问题和标签。