我有一個表在磚叫做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(所以它可以很容易地用於表),但任何解決方案的工作。
所以當我讀它,這就是我如何讀它。我改變了臨時視圖表名與其他表所以不會衝突。
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列。