dataframe - 如何将列表列与 pyspark 数据框列相交?
问题描述
我有一个下面的 pyspark 数据框,我需要创建新列 (new_col),它是 X 和 Y 列中的常见项目,不包括 Z 中的项目。
df
id X Y Z new_col
1 [12,23,1,24] [13,412,12,23,24] [12] [23,24]
2 [1,2,3] [2,4,5,6] [] [2]
解决方案
如果您的架构如下:
df.printSchema()
#root
# |-- id: long (nullable = true)
# |-- X: array (nullable = true)
# | |-- element: long (containsNull = true)
# |-- Y: array (nullable = true)
# | |-- element: long (containsNull = true)
# |-- Z: array (nullable = true)
# | |-- element: long (containsNull = true)
和您的 pyspark 版本 2.4+,您可以使用array_intersect
和array_except
:
from pyspark.sql.functions import array_except, array_intersect
df=df.withColumn("new_col", array_except(array_intersect("X", "Y"), "Z"))
df.show()
#+---+---------------+---------------------+----+--------+
#|id |X |Y |Z |new_col |
#+---+---------------+---------------------+----+--------+
#|1 |[12, 23, 1, 24]|[13, 412, 12, 23, 24]|[12]|[23, 24]|
#|2 |[1, 2, 3] |[2, 4, 5, 6] |[] |[2] |
#+---+---------------+---------------------+----+--------+
推荐阅读
- git - 'git diff' 可以只输出长行中的变化吗?
- javascript - 如何在 JavaScript 中创建一个将文本增加 1px 的按钮
- c# - 使用 XmlSerializer 时,我们可以将 Flag 枚举值标记为过时吗?
- python - 芹菜,大块和弦
- angular - 在我的组件中将枚举转换为材料选择
- android - 在为 android 设计模型时应该考虑导航栏吗?
- python - 获取列出项目开始变化的索引
- dataweave - 如何在 Mulesoft Dataweave 中按日期时间排序?
- c# - 如何创建可转换为 SQL 的扩展方法
- python-3.x - 如果选择了国家,我想打印国家首都