查询数据砖的半结构化数据

请注意

在砖运行时8.1及以上。

本文描述了砖SQL操作符可以用来查询和转换的半结构化数据存储为JSON。

请注意

如果处置不当,该功能允许你读半结构化数据文件。然而,对于优化阅读查询性能砖建议您提取的嵌套列使用正确的数据类型。

你从字段中提取一个列包含JSON字符串使用语法<列名称>:< extraction-path >,在那里<列名称>字符串列名和吗< extraction-path >现场提取的路径。返回的结果字符串。

与高嵌套数据创建一个表

运行下面的查询与高度嵌套的数据创建一个表。本文中的示例参考此表。

创建store_data作为选择”{“存储”:{“水果”:[{“重量”:8,“类型”:“苹果”},{“重量”:9,“类型”:“梨”}),“篮子”:((1、2、{“b”:“y”,“一个”:“x”}),(3、4),(5、6)),“书”:({奈杰尔•里斯”“作者”:““标题”:“世纪语录”,“类别”:“引用”,“价格”:8.95},{“作者”:“赫尔曼·麦尔维尔”,“标题”:“白鲸记”,“类别”:“小说”,“价格”:8.99,“isbn”:“0-553-21311-3”},{“作者”:“J。r·r·托尔金”,“标题”:“指环王”,“类别”:“小说”,“读者”:({“年龄”:25岁的“名称”:“bob”},{“年龄”:26日,“名字”:“杰克”}),“价格”:22.99,“isbn”:“0-395-19395-8”}),“自行车”:{“价格”:19.95,“颜色”:“红色”}},“老板”:“艾米”,“邮政编码”:“94025”,“fb: testid”:“1234”}'作为

提取一个顶级列

提取一个列,指定JSON的名称字段中提取的道路。

您可以提供列名在括号内。列引用在括号匹配情况敏感。列名称区分大小写的引用。

选择:老板,:老板store_data
+ - - - - - - - - - - - - - - +|老板|老板|+ - - - - - - - - - - - - - - +|艾米|艾米|+ - - - - - - - - - - - - - - +
——引用是大小写敏感的,当你使用括号选择:老板case_insensitive,:【“主人”]case_sensitivestore_data
+ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - +|case_insensitive|case_sensitive|+ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - +|艾米||+ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - +

用引号的空格和特殊字符转义。字段名称匹配的情况如果不

——使用引号转义特殊字符。引用是大小写不敏感的,当你使用引号。——使用括号来让他们区分大小写。选择:邮政编码代码,:邮政编码代码,:【“fb: testid”]store_data
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +|邮政编码代码|邮政编码代码|神奇动物:testid|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +|94025年|94025年|1234年|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +

请注意

如果一个JSON记录包含多个列,可以匹配提取路径由于不分大小写匹配,您将会收到一个错误让你使用括号。如果你有匹配的列行,你将不会收到任何错误。以下将抛出一个错误:{“foo”:“酒吧”,“Foo”:“酒吧”},以下不会抛出错误:

{“foo”:“酒吧”}{“Foo”:“酒吧”}

提取嵌套的字段

您指定嵌套域通过点符号或使用括号。当你使用括号、列匹配情况下敏感。

——使用点符号选择:商店自行车store_data——返回的列是一个字符串
+ - - - - - - - - - - - - - - - - - - +|自行车|+ - - - - - - - - - - - - - - - - - - +|{||“价格”:19.95,||“颜色”:“红色”||}|+ - - - - - - - - - - - - - - - - - - +
——使用括号选择:商店(“自行车”),:商店(“自行车”]store_data
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +|自行车|自行车|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +|{|||“价格”:19.95,|||“颜色”:“红色”|||}||+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +

从数组中提取值

你用方括号索引元素数组。指数是基于0。您可以使用星号(*)其次是点或括号从数组中所有元素中提取等领域。

——索引元素选择:商店水果(0),:商店水果(1]store_data
+ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - +|水果|水果|+ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - +|{|{||“重量”:8,|“重量”:9,||“类型”:“苹果”|“类型”:“梨”||}|}|+ - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - +
——从数组中提取等领域选择:商店(*]。国际标准图书编号store_data
+ - - - - - - - - - - - - - - - - - - - - - - +|国际标准图书编号|+ - - - - - - - - - - - - - - - - - - - - - - +|(||,||“0-553-21311-3”,||“0-395-19395-8”||]|+ - - - - - - - - - - - - - - - - - - - - - - +
——访问数组在数组或结构体数组内选择:商店篮子(*),:商店篮子(*][0]first_of_baskets,:商店篮子(0][*]first_basket,:商店篮子(*][*]all_elements_flattened,:商店篮子(0][2]。b子域store_data
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +|篮子|first_of_baskets|first_basket|all_elements_flattened|子域|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +|(|(|(|(1,2,{“b”:“y”,“一个”:“x”},3,4,5,6]|y||(1,2,{“b”:“y”,“一个”:“x”}),|1,|1,||||(3,4),|3,|2,||||(5,6]|5|{“b”:“y”,“一个”:“x”}||||]|]|]|||+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +

把值

您可以使用::把值基本数据类型。使用from_json方法将嵌套的结果成更复杂的数据类型,比如数组或结构。

——返回价格翻倍,不是一个字符串选择:商店自行车价格::store_data
+ - - - - - - - - - - - - - - - - - - +|价格|+ - - - - - - - - - - - - - - - - - - +|19.95|+ - - - - - - - - - - - - - - - - - - +
——使用from_json转换为更复杂的类型选择from_json(:商店自行车,“价格翻倍,颜色字符串”)自行车store_data——返回的列是一个结构体包含的列价格和颜色
+ - - - - - - - - - - - - - - - - - - +|自行车|+ - - - - - - - - - - - - - - - - - - +|{||“价格”:19.95,||“颜色”:“红色”||}|+ - - - - - - - - - - - - - - - - - - +
选择from_json(:商店篮子(*),“数组<数组<字符串> >”)篮子store_data——列返回一个字符串数组的数组
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +|篮子|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +|(||(“1”,“2”,“{\”b\”:\”y\”,\”一个\”:\”x\”}]”,||(“3”,“4”),||(“5”,“6”]||]|+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

空的行为

当一个JSON领域存在的值,您将收到一个SQL该列的值,而不是一个文本值。

选择”{零}“关键”:“:关键sql_null,”{零}“关键”:“:关键= =“零”text_null
+ - - - - - - - - - - - - - - - - - - - - - - - - - +|sql_null|text_null|+ - - - - - - - - - - - - - - - - - - - - - - - - - +|真正的||+ - - - - - - - - - - - - - - - - - - - - - - - - - +

嵌套数据转换使用火花SQL操作符

Apache火花有很多内置函数来处理复杂和嵌套数据。以下笔记本包含示例。

此外,高阶函数提供了许多额外的选项,当内置火花运营商不用于将数据按你所希望的方式。

复杂的嵌套数据的笔记本

在新标签页打开笔记本