我有一個表在磚叫做owner_final_delta列聯係人保存數據和這個結構:
數組< struct <地址:struct <公寓:字符串,城市:字符串,房子:字符串,poBox:字符串,來源:數組<字符串>,狀態:字符串,街:字符串類型:字符串,郵政編碼:string >,地址:數組< struct <公寓:字符串,城市:字符串,房子:字符串,lastSeen:字符串,poBox:字符串,來源:數組<字符串>,狀態:字符串,街:字符串類型:字符串,郵政編碼:string > >, contactKey:字符串,郵件:數組< struct < emailId:字符串,lastSeen:字符串,來源:數組<字符串> > >,lastModifiedDate:字符串,名字:struct < <字符串> firstname:數組,lastname:數組<字符串>,middleNames:數組<字符串>,禮:數組<字符串>,後綴:數組<字符串> >,電話:數組< struct <擴展:字符串,lastSeen:字符串,線型:字符串、數字:字符串,來源:數組<字符串>,validSince: string > >,關係:字符串,來源:數組<字符串> > >
由此,我想提取emailId。我可以提取聯係人。電子郵件是一個數組,其中包含的emailId本身也可以是一個數組(如果有多個郵件綁定到一個記錄)。下麵是一個例子,一個記錄從contacts.emails回來。類似於業務/公司聯係。所以每個元素在聯係人。電子郵件數組是一個人在業務/公司。此外,每個人可以擁有多個電子郵件(emailId)。
數組
我想實現的是一個列emailId emailId每一行。在上麵的例子中,我想這一個記錄分成9行,每個emailId一個。我試著使用get_json_object但必須做錯了什麼。
選擇get_json_object (cast(聯係人。電子郵件作為字符串),從owner_final_delta emailId .emailId美元)
我試著上麵的查詢以及其他變化像使用STR()或聯係人。郵件[0]美元或聯係人。電子郵件和他們都遇到編譯錯誤或返回null值。我寧願一個解決方案使用SQL(所以它可以很容易地用於表),但任何解決方案的工作。
df = sqlContext.table (“owner_final_delta”)進口pyspark.sql。函數作為F df.select (F.explode (df.contacts.emails) .alias(“電子郵件”)),告訴()
如果你隻爆炸的郵件,我想每一行將會是一個新的emailId類別。你得到了嗎?
- - - - - - -
SQL的生活
如果列是“接觸”和電子郵件是嵌套的第一級emailId json,我想您可能不得不離開了第二個“聯係人”我。
選擇聯係人:郵件[*]。從owner_final_delta emailId
這也給你一個錯誤嗎?
我認為你是對的。我們正在接近。
對於Python,讓我們嚐試兩次爆炸。如果我們有,[[emailId、日期、來源],[emailId、日期、來源],[emailId、日期、來源]]然後讓我們爆炸,所以每個電子郵件ID列出來都有它自己的行。
df = sqlContext.table (“owner_final_delta”)進口pyspark.sql。函數作為F df.select (F.explode (F.explode (df.contacts.emails) .alias(“電子郵件”)).alias (“email_ids”)),告訴()
然後SQL,這個命令給你錯誤嗎?我
選擇from_json(聯係人:郵件[*],“數組<數組<字符串> >”)從owner_final_delta郵件
我認為電子郵件是一個字符串數組的數組。我想看看我們是否可以先在這裏沒有任何錯誤之前做更深入的巢。
所以我試著爆炸兩次,得到了錯誤:發電機不支持嵌套的時候的表情,但有:爆炸(爆炸(contacts.emails)作為電子郵件)。
做一些研究後,爆炸是一個生成器函數,使得新列所以你不能用功能爆炸。https://stackoverflow.com/questions/50125971/generators-are-not-supported-when-its-nested-in-express..。
我也調查爆炸函數在熊貓但不知道這個人會工作或如何正確獲取數據格式化的熊貓DataFrame。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.explode.html
SQL查詢給我同樣的錯誤不匹配的參數類型。