python - Pyspark 比较两列是列表
问题描述
我有一个如下的数据框。这两列是列表。
df= sc.parallelize([
{"subject_1":['A','B'],"subject_2":['A','B','C'] },
{"subject_1":['A','C'],"subject_2":['A','B','C'] },
{"subject_1":['A','B','D'],"subject_2":['A','B','E'] }
]).toDF()
df.show()
我需要如下转换数据框。添加从前两列派生的三个新列。这需要比较两列列表中的项目。
做这个的最好方式是什么?
解决方案
对于Spark2.4+
, 使用array_intersect
和array_except
:
from pyspark.sql import functions as F
df.withColumn("both", F.array_intersect("subject_1","subject_2"))\
.withColumn("only_1", F.array_except("subject_1","subject_2"))\
.withColumn("only_2", F.array_except("subject_2","subject_1")).show()
#+---------+---------+------+------+------+
#|subject_1|subject_2| both|only_1|only_2|
#+---------+---------+------+------+------+
#| [A, B]|[A, B, C]|[A, B]| []| [C]|
#| [A, C]|[A, B, C]|[A, C]| []| [B]|
#|[A, B, D]|[A, B, E]|[A, B]| [D]| [E]|
#+---------+---------+------+------+------+
推荐阅读
- javascript - 按名称动态调用从另一个模块导入的 javascript 函数
- php - 当使用对象的属性作为 where 语句的输入时,雄辩的查询构建器得到“BadMethodCallException”
- token - 使用提升的访问令牌运行时,对物理驱动器序列号的 WMI 查询返回不同的结果
- amazon-web-services - 是否可以在 SAML 响应到达 cognito 之前拦截它?
- javascript - Forge 查看器:Autodesk.BoxSelection 扩展错误
- elasticsearch - Elasticsearch 不会从备份中恢复系统索引
- html - Wkhtmltopdf print.ctp 无法正确加载表格
- ruby-on-rails - Rails 将 user_id 从获取的 IP 地址分配给调查事件
- apache-spark - 尝试在 Windows 上运行 Apache Spark 示例时出错
- c# - Asp.Net Mvc 应用程序的 Redis 缓存实现