取消
顯示的結果
而不是尋找
你的意思是:

做一個連接在同一個行SQL

qwerty1
新的貢獻者三世

我的數據轉儲的JSON響應從一個API。json的模式

col_name data_type數據數組< struct <屬性:struct <名稱:字符串,年齡:Int關係:struct <地址:struct <數據:arraay < struct < id:長,類型:字符串> > > > > > >包括數組< struct < id:長,類型:字符串,屬性:struct <地址:字符串,postalCode:字符串,國家:String > > >

正如你所看到的列數據包含一個數組細節,包括一個關係到那個人的地址通過一個id列包括包含實際的地址。

我想將這些數據轉換成一個新表,數據包括地址的人。總之我想擺脫這種“包括”業務。我現在隻有SQL去因為我使用這個在直播表查詢。

1接受解決方案

接受的解決方案

qwerty1
新的貢獻者三世

我使用一個類似的解決方案(爆炸隻有一列)工作

在原帖子查看解決方案

4回複4

Kaniz
社區經理
社區經理

嗨@Ashwin Bhaskar,您可以使用SQL JOIN操作加入數據,包括基於陣列

id字段。下麵是一個示例SQL查詢,應該做到這一點:

選擇data.attributes.name作為名字,data.attributes。年齡,年齡,included.attributes。地址地址,included.attributes。postalCode postalCode, included.attributes。國家國家從十字架your_table_name加入UNNEST運算(數據)作為數據加入UNNEST運算(data.attributes.relationships.address.data)在rel.id rel =。id加入UNNEST運算(包括)列入rel.id =。id和rel.type = included.type

在這個查詢中,我們使用交叉連接UNNEST運算平數據數組為單獨的行。然後我們加入的rel數組從數據數組包含基於id字段的數組。最後,我們選擇相關字段數組創建一個新表組成的個人數據和地址信息。

注意,這個查詢假設每個人隻有一個地址和數據數組的id字段匹配的id字段包含數組。如果這些假設不為您的數據,您可能需要修改相應的查詢。

qwerty1
新的貢獻者三世

@Kaniz Fatma這不是基本上做一個“爆炸”在“數據”和“包含”,然後加入他們嗎?我們最終做的加入對整個數據集,而不是行。

Kaniz
社區經理
社區經理

嗨@Ashwin Bhaskar,道歉的困惑在我以前的響應。你是正確的,之前的解決方案對整個數據集執行交叉連接,這可能不是有效的。相反,我們可以使用內聯UDF來實現所需的輸出沒有一個完整的加入。

下麵是一個示例SQL查詢使用內聯UDF(用戶定義函數)在火花SQL:

創建臨時函數find_address org.apache.spark.sql.catalyst.expressions.ArrayFind”;與轉換(選擇d.attributes.name d.attributes。年齡,find_address(包括,我- >。id = (d.relationships.address.data))從your_table_name matched_address側視爆炸(數據)data_table d)選擇名字,年齡,matched_address.attributes。地址,matched_address.attributes。postalCode matched_address.attributes。國家從轉變;

在這個查詢中,我們首先創建一個臨時的內聯叫做find_address UDF

使用內置的ArrayFind函數。

這個函數搜索數組中的一個元素,滿足給定的條件並返回第一個匹配元素。

接下來,我們創建一個臨時爆炸視圖轉換的數據數組和使用find_address函數匹配地址標識在相同的行。最後,我們選擇人的細節以及它們的地址信息

改變了觀點。

請your_table_name替換為實際的表的名稱。

注意,內聯UDF功能是特定於火花SQL和其他SQL環境中可能不可用。

qwerty1
新的貢獻者三世

我使用一個類似的解決方案(爆炸隻有一列)工作

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map