SQL:爆炸数组

时间:2012-07-25 23:06:00

标签: sql arrays json hive explode

我有一个包含JSON对象的表。每个JSON对象在方括号中包含一个数组,用逗号分隔。

如何访问方括号数组中的任何元素,例如" Matt",使用SQL?

{"str":
   [
     1,
     134,
     61,
     "Matt",
     {"action.type":"registered","application":491,"value":423,"value2":12344},
     ["application"],
     [],
     "49:0"
   ]
}

我正在使用' Hive'在Hadoop上。如果您知道如何在SQL中执行此操作,那很好:)

2 个答案:

答案 0 :(得分: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"
} }

接下来,您需要将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来说非常具体,所以更新问题和标签是值得的。

答案 1 :(得分:1)

除非您使用非常特定于数据库引擎的内容,并且未指定正在使用的数据库引擎,否则不能这样做。

“你不能”的原因是SQL / RDBMS不是为那种类型的存储而设计的。我建议使用适当的规范化或NoSQL解决方案,具体取决于您的需求。