首页 > 解决方案 > 将列组合成键、值对列表(无 UDF)

问题描述

我想创建一个新列,它是其他一些列的 JSON 表示。列表中的键、值对。

资源:

起源 目的地 数数
多伦多 渥太华 5
蒙特利尔 温哥华 10

我想要的是:

起源 目的地 数数 json
多伦多 渥太华 5 [{“起源”:“多伦多”},{“目的地”,“渥太华”},{“计数”:“5”}]
蒙特利尔 温哥华 10 [{"origin":"montreal"},{"destination","vancouver"}, {"count":"10"}]

(一切都可以是字符串,没关系)。

我试过类似的东西:

df.withColumn('json', to_json(struct(col('origin'), col('destination'), col('count'))))

但它会key:value在一个对象中创建包含所有对的列:

{"origin":"United States","destination":"Romania"}

没有UDF这可能吗?

标签: apache-sparkpysparkapache-spark-sqlkey-value

解决方案


解决此问题的一种方法:

import pyspark.sql.functions as F

df2 = df.withColumn(
    'json', 
    F.array(
        F.to_json(F.struct('origin')),
        F.to_json(F.struct('destination')),
        F.to_json(F.struct('count'))
    ).cast('string')
)

df2.show(truncate=False)
+--------+-----------+-----+--------------------------------------------------------------------+
|origin  |destination|count|json                                                                |
+--------+-----------+-----+--------------------------------------------------------------------+
|toronto |ottawa     |5    |[{"origin":"toronto"}, {"destination":"ottawa"}, {"count":"5"}]     |
|montreal|vancouver  |10   |[{"origin":"montreal"}, {"destination":"vancouver"}, {"count":"10"}]|
+--------+-----------+-----+--------------------------------------------------------------------+

推荐阅读