Spark Dataframe将json键值组合在一行Scala或Python中

2024-06-28 20:48:24 发布

您现在位置: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解决方案都会有所帮助。 谢谢


Tags: 数据fromsqlbodyselectsparkdatatableexternalid
1条回答
网友
1楼 · 发布于 2024-06-28 20:48:24

使用array方法代替struct,因为需要body作为数组。并使用create_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"}]|
+                              -+

相关问题 更多 >