簡體   English   中英

Spark Dataframe 在一行中結合 json 鍵值 - Scala 或 ZA7F5F35426B927411FC9231B563821

[英]Spark Dataframe combine json key value in one row - Scala or Python

我正在查詢 spark sql ,如下所示,並嘗試將列合並為一行:

interalexternalid = spark.sql("""Select InternalId, ExternalId from datatable limit 4""")

jsonDf = interalexternalid.select(to_json(struct([interalexternalid[x] for x in interalexternalid.columns])).alias("body"))
display(jsonDf)

我得到這樣的數據:

"body"
{"InternalId":480941,"ExternalId":"a020H00001Tt7NrQAJ"}
{"InternalId":480942,"ExternalId":"a020H00001Tt7NsQAJ"}
{"InternalId":480556,"ExternalId":"a020H00001TdAEVQA3"}
{"InternalId":480557,"ExternalId":"a020H00001TdAEWQA3"}

我的目標是在“正文”列中獲取如下數據

“身體”:

 [{"InternalId": 480941}, {"ExternalId": "a020H00001Tt7NrQAJ"}]
 [{"InternalId": 480942}, {"ExternalId": "a020H00001Tt7NsQAJ"}]
 [{"InternalId": 480556}, {"ExternalId": "a020H00001TdAEVQA3"}]
 [{"InternalId": 480557}, {"ExternalId": "a020H00001TdAEWQA3"}]

如何做到這一點。 我在上述情況下使用 python 。 但 python 和 scala 解決方案都會有所幫助。 謝謝

而不是struct使用array方法,因為您需要body作為數組。 並使用create_map從列名到值創建 Map:

from pyspark.sql.functions import array, lit, col, to_json, create_map

df.select(to_json(
    array(*[create_map(lit(c), col(c)) for c in df.columns])
).alias("body")).show(truncate=False)

+-------------------------------------------------------------+
|body                                                         |
+-------------------------------------------------------------+
|[{"InternalId":"480941"},{"ExternalId":"a020H00001Tt7NrQAJ"}]|
|[{"InternalId":"480942"},{"ExternalId":"a020H00001Tt7NsQAJ"}]|
|[{"InternalId":"480556"},{"ExternalId":"a020H00001TdAEVQA3"}]|
|[{"InternalId":"480557"},{"ExternalId":"a020H00001TdAEWQA3"}]|
+-------------------------------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM