SQL:分解数组

标签 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"
   ]
}

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

最佳答案

您可以按如下方式在 Hive 中执行此操作:

首先,您需要一个 JSON SerDe(串行器/解串器)。我见过的最实用的是https://github.com/rcongiu/Hive-JSON-Serde/ . Peter Sankauskas 的 SerDe 似乎无法处理如此复杂的 JSON。在撰写本文时,您需要使用 Maven 编译 SerDe,并将 JAR 放置在 Hive session 可以访问它的位置。

接下来,您将需要更改 JSON 格式。原因是 Hive 对数组采用强类型 View ,因此混合整数和其他东西是行不通的。考虑切换到这样的结构:

{"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 是如此特定,所以更新问题和标签是值得的。

关于SQL:分解数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659976/

相关文章:

java - 在 Java/Android 中测试空 JSON 对象

javascript - 是否可以将js文件中的图像动态加载到html文件中?

sql - 如何获取两个日期之间耗时,忽略某些时间范围?

php - 在一个 php 页面上运行两个单独的 SQL 查询

java - 通过排列的动态循环量

android - 什么是 JSONArray、JSONObject、JSONStringer 和 JSONTokenizer

php - php mysql中的计算

mysql - SQL 查询以显示包括产品图像在内的最新订单信息 (Prestashop)

python - 为什么 numpy 在比较来自两个不同列表的整数和浮点值时返回真实索引

c++ - 动态数组只从程序返回第一个元素