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

提取數據從一個多層次的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

所以當我讀它,這就是我如何讀它。我改變了臨時視圖表名與其他表所以不會衝突。

Python:

df1 = spark.read.format (csv)。選項(“頭”,“真正的”)。選項(“逃脫”,“\”).option(“多行”,真的).load df1.createOrReplaceTempView (“file_path_where_csv_file_is_located”) (“owner_final_delta1”)顯示(df1)
選擇from_json(聯係人”、“數組”< struct <地址:struct <公寓:字符串,城市:字符串,房子:字符串,poBox:字符串,來源:數組<字符串>,狀態:字符串,街:字符串類型:字符串,郵政編碼:string >,地址:數組< struct <公寓:字符串,城市:字符串,房子:字符串,lastSeen:字符串,poBox:字符串,來源:數組<字符串>,狀態:字符串,街:字符串類型:字符串,郵政編碼:string > >, contactKey:字符串,郵件:數組< struct < emailId:字符串,lastSeen:字符串,來源:數組<字符串> > >,lastModifiedDate:字符串,名字:struct < <字符串> firstname:數組,lastname:數組<字符串>,middleNames:數組<字符串>,禮:數組<字符串>,後綴:數組<字符串> >,電話:數組< struct <擴展:字符串,lastSeen:字符串,線型:字符串、數字:字符串,來源:數組<字符串>,validSince: string > >,關係:字符串,來源:數組<字符串> > > " " ")contacts_parsed,從owner_final_delta1 *

最後一個是SQL。

這似乎工作!我第一次上傳它作為一個csv但發現數據丟失,所以沒有工作。但後來我保存它作為.xlsx文件並上傳數據磚。然後我做了一個表出來,看到的所有屬性(包括聯係人)的字符串類型。

當運行上麵的SQL命令你發布,輸出返回contacts_parsed列和小箭頭讓我看到的JSON對象。

當運行這個作為查詢的一部分與爆炸之前,我看到了emailIds列完美。我唯一的問題是,如果這個工作聯係人有多個emailIds。我不知道是否有這樣的例子在我給你的樣品,但是根據您提供的解決方案應該與多個emailIds這些聯係人的工作嗎?“工作”需要有一個emailId每一行,即使一個人有多個emailIds接觸,打破了這樣一個在每一行的emailIds列。

應該爆炸函數示例數據我都沒有的情況下,這個數組有多個emailId所以你將不得不做一組,看看你看到數大於1在你自己的更大的數據集。我看到了有很多空emailIds和空接觸細胞樣本,所以通過這些過濾器。

這將是集團的_id並檢查數大於1對吧?

是的。但你必須確保你有重複的數據。如果你不能找到一個馬上要做測試,我要做一個測試,我的合成添加一行數據中有多個emailIds數組。當你做一個選擇在解析表上的版本,你可以做一個ID號的合成數據是否有超過一行。

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

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

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

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

Baidu
map