添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
痴情的铁链  ·  pyspark.sql.functions. ...·  1 周前    · 
风流的板栗  ·  Spark 的学习使用·  1 周前    · 
腹黑的蚂蚁  ·  【Uni-App】page.json ...·  1 年前    · 
被表白的书签  ·  android - Pass a ...·  2 年前    · 

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