当前位置: 首页 > 面试题库 >

SQL:爆炸数组

宗冠宇
2023-03-14
问题内容

我有一个包含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特有的,因此值得更新问题和标签。



 类似资料:
  • 问题内容: 我一直非常依赖CSS来开发我正在工作的网站。现在,所有CSS样式都在每个标记的基础上应用,因此现在我尝试将其移至更多外部样式中,以帮助将来进行任何更改。 但是现在的问题是,我注意到我遇到了“ CSS爆炸”。对我来说,决定如何最好地组织和抽象CSS文件中的数据变得越来越困难。 我正在从大量基于表格的网站中使用网站中的大量标签。因此,我得到了许多如下所示的CSS选择器: 还算不错,但是作为

  • 问题内容: 我想从包含单词列表的DataFrame转换为每个单词都在其自己行中的DataFrame。 如何在DataFrame中的列上爆炸? 这是我尝试的一些示例,您可以在其中取消注释每个代码行并获取以下注释中列出的错误。我在带有Spark 1.6.1的Python 2.7中使用PySpark。 请指教 问题答案: 和是SQL函数。两者都在SQL上运行。将Java正则表达式作为第二个参数。如果要在

  • 描述 (Description) &可以在逗号分隔的列表中生成所有可能的选择器排列。 例子 (Example) 以下示例演示了如何使用&生成LESS文件中所有可能的选择器排列 - <html> <head> <link rel = "stylesheet" href = "style.css" type = "text/css" /> <title>Combinato

  • 问题内容: 下面是表2中的数据 我可以使用以下查询来爆炸以上数据,并且对于以上数据也可以正常工作- 这样我会得到很好的输出 但是在某些情况下,我在下表中有这样的数据,对于相同的product_id- 我需要使用HiveQL查询为上述数据输出类似的结果- 这有可能做到这一点吗? 任何建议将不胜感激。 PS我几天前问这个问题,但是在这种情况下,数据是不同的,现在数据完全不同了,我需要类似的输出。 问题

  • 我正在使用Spark SQL(我提到它是在Spark中,以防影响SQL语法-我还不太熟悉,还不能确定),我有一个表,我正在尝试重新构造,但我在尝试同时转置多个列时遇到了麻烦。 基本上,我有看起来像这样的数据: 并且我想同时分解varA和varB(长度将始终保持一致) - 因此最终输出如下所示: 但是我似乎只能让一个explee(var)语句在一个命令中工作,如果我尝试链接它们(即在第一个分解命令之

  • 我一直在努力研究如何使用maven overlay插件将项目排除在爆炸战争之外。 我有以下内容: xml和applicationcontext.xml可以很好地排除,但它们位于:${basedir}/src/main/webapp/web-inf/下 无论我尝试什么,这些文件是静止的,覆盖,尽管排除。