我的數據轉儲的JSON響應從一個API。json的模式
col_name data_type數據數組< struct <屬性:struct <名稱:字符串,年齡:Int關係:struct <地址:struct <數據:arraay < struct < id:長,類型:字符串> > > > > > >包括數組< struct < id:長,類型:字符串,屬性:struct <地址:字符串,postalCode:字符串,國家:String > > >
正如你所看到的列數據包含一個數組人細節,包括一個關係到那個人的地址通過一個id列包括包含實際的地址。
我想將這些數據轉換成一個新表,數據包括地址的人。總之我想擺脫這種“包括”業務。我現在隻有SQL去因為我使用這個在直播表查詢。
嗨@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字段包含數組。如果這些假設不為您的數據,您可能需要修改相應的查詢。
嗨@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環境中可能不可用。