Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:分解数组_Sql_Arrays_Json_Hive_Explode - Fatal编程技术网

SQL:分解数组

SQL:分解数组,sql,arrays,json,hive,explode,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"

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

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

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

我正在Hadoop的桌面上使用“蜂巢”。如果您知道如何在SQL中实现这一点,那很好:)

除非您使用非常特定于您的数据库引擎的东西,而且您还没有指定要使用的数据库引擎,否则您不能这样做


“您不能”的原因是SQL/RDBMS不是为这种类型的存储设计的。我建议根据您的需要使用适当的规范化或NoSQL解决方案。

您可以在Hive中执行以下操作:

首先,您需要一个JSON SerDe(序列化器/反序列化器)。我见过的最实用的是。Peter Sankauskas的SerDe似乎无法处理如此复杂的JSON。在撰写本文时,您将需要使用Maven编译SerDe,并将JAR放在您的配置单元会话可以访问它的地方

接下来,您需要更改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全部放在一行中。我不确定这是蜂巢还是塞德的怪癖,但你需要这么做

然后将数据复制到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';

最后但并非最不重要的一点是,由于这是特定于Hive的,因此有必要更新问题和标记。

您使用的是哪种RBDM?MySql?Sql Server?Oracle?@MichaelFredrickson我正在使用Hive,但功能与MySQL非常相似。
select str.st1.type from json;