添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Spark Dataframe在一行中结合json键值 - Scala或Python

2 人不认可

我正在像下面这样查询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"}

我的目标是在 "body "列中获得如下数据

"body":

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

如何才能实现这一点。我在上述情况下使用python。但python和scala的解决方案将是有益的。

python
scala
apache-spark
apache-spark-sql
pyspark-dataframes
pauldx
pauldx
发布于 2020-04-28
1 个回答
Psidom
Psidom
发布于 2020-04-28
已采纳
0 人赞同

使用 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"}]|