我有一个包含JSON对象的表。每个JSON对象在方括号中均包含一个数组,并用逗号分隔。
如何使用SQL访问方括号数组中的任何元素,例如“ Matt”?
{"str": [ 1, 134, 61, "Matt", {"action.type":"registered","application":491,"value":423,"value2":12344}, ["application"], [], "49:0" ] }
我在Hadoop上使用“ Hive”。如果您知道如何在SQL中执行此操作,那很好:)
您可以在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特有的,因此值得更新问题和标签。