查詢數據磚的半結構化數據

請注意

在磚運行時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火花有很多內置函數來處理複雜和嵌套數據。以下筆記本包含示例。

此外,高階函數提供了許多額外的選項,當內置火花運營商不用於將數據按你所希望的方式。

複雜的嵌套數據的筆記本

在新標簽頁打開筆記本