apache-spark - 将列组合成键、值对列表(无 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这可能吗?
解决方案
解决此问题的一种方法:
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"}]|
+--------+-----------+-----+--------------------------------------------------------------------+
推荐阅读
- sql - 检查具有 1000 万行的表中是否存在行
- javascript - 使用 material-ui 覆盖子类属性
- reactjs - 使用 React 和 Axios 将数组作为 Schema 的一部分发布
- yocto - 从 Yocto 中删除 netdata 包
- multithreading - 对象列表的 ExecutorService
- gdb - “set varsize-limit x”返回“当前上下文中没有“varsize”的当前定义。”
- ruby-on-rails - 如何制作范围,将输出自定义数据?
- c - 如何在 Visual Studio 2019 中将堆栈移动到堆?
- python - 通过查看众所周知的路径来配置 Python 记录器
- python - 在remove_all之后没有删除python cronjob