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

提取數據從一個多層次的JSON對象

aschiff
因素二世

我有一個表在磚叫做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)。

數組

  • 0:[{“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“來源”:“REONOMY”}, {“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“來源”:“REONOMY”}, {“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“源”(“REONOMY”)}):
  • 1:[{“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“來源”:[“SNL”、“REONOMY”]}, {“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“來源”:“REONOMY”}, {“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“源”(“REONOMY”)}):
  • 2:[{“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“來源”:“REONOMY”}, {“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“來源”:“REONOMY”}, {“emailId”:“(電子郵件保護)”、“lastSeen”:“10月12日,2021年6:51:33點”、“源”(“REONOMY”)}):

我想實現的是一個列emailId emailId每一行。在上麵的例子中,我想這一個記錄分成9行,每個emailId一個。我試著使用get_json_object但必須做錯了什麼。

選擇get_json_object (cast(聯係人。電子郵件作為字符串),從owner_final_delta emailId .emailId美元)

我試著上麵的查詢以及其他變化像使用STR()或聯係人。郵件[0]美元或聯係人。電子郵件和他們都遇到編譯錯誤或返回null值。我寧願一個解決方案使用SQL(所以它可以很容易地用於表),但任何解決方案的工作。

24日回複24

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

這也給你一個錯誤嗎?

和你修改爆炸功能,我現在讓整個contacts.emails數組的數組。它看起來像[[emailId、日期、來源]]。在一行可能有多個像[[emailId、日期、來源],[emailId、日期、來源],[emailId、日期、來源]]。所以我們仍然需要進一步鑽。

至於SQL命令,我還得到一個類型不匹配錯誤所示。

圖像但是在選擇聯係人::字符串:郵件[*]。emailId owner_final_delta我得到一個輸出,但所有的值是null。所以,我相信我們在正確的軌道上,隻需要做一些細微的調整。和謝謝你的幫助!

我認為你是對的。我們正在接近。

對於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查詢給我同樣的錯誤不匹配的參數類型。

圖像

有什麼方法可以發布一個小樣本owner_final_delta表的所以我可以嚐試一些代碼在我身邊嗎?

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

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

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

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

Baidu
map