Pyspark:检查数组类型列是不是包含列表中的值[重复]

Posted

技术标签:

【中文标题】Pyspark:检查数组类型列是不是包含列表中的值[重复]【英文标题】:Pyspark: Check if Array Type Column Contains a Value From a List [duplicate]Pyspark:检查数组类型列是否包含列表中的值[重复] 【发布时间】:2020-11-17 16:47:19 【问题描述】:

有没有办法检查ArrayType 列是否包含列表中的值?它不必是一个实际的 python 列表,只要是 spark 可以理解的东西。我不想使用udf,因为最好避免使用它们。

比如我有数据:

+-------------+
|category_code|
+-------------+
|         [88]|
|     [20, 50]|
+-------------+

我想检查[43, 44, 50] 是否在每一行中,所以输出将是:

+-------------+-----+
|category_code| test|
+-------------+-----+
|         [88]|false|
|     [20, 50]| true|
+-------------+-----+

我知道pyspark.sql.functions.array_contains() 函数,但这仅允许检查一个值而不是值列表。

编辑:这是针对 Spark 2.4 的

【问题讨论】:

最好是 spark 2.4,但如果 spark 3.0 有解决方案,我会很高兴听到的。 @mazaneicha 我不认为这是重复的,因为 Spark SQL 和 pyspark 是不同的 API @fungie127 查看引用帖子中的最后一个答案。 【参考方案1】:

使用arrays_overlap函数&可以从Spark 2.4.0获得。

检查下面的代码。

>>> df.show()
+-------------+
|category_code|
+-------------+
|     [20, 50]|
|         [88]|
+-------------+
df.withColumn("list",F.array([F.lit(i) for i in [40,44,50]])) \
.withColumn("test",F.arrays_overlap(F.col("category_code"),F.col("list"))) \
.drop("list") \
.show()
+-------------+-----+
|category_code| test|
+-------------+-----+
|     [20, 50]| true|
|         [88]|false|
+-------------+-----+

【讨论】:

以上是关于Pyspark:检查数组类型列是不是包含列表中的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查列 pyspark df 的值是不是存在于其他列 pyspark df

Spark DataFrame ArrayType 或 MapType 用于检查列中的值

如何根据 Pyspark 中数组列中的值创建新列

pyspark concat_ws 用于数组到字符串

如何检查 MySQL JSON 列是不是包含 laravel 中的值?

派斯帕克;用于检查列是不是包含列表元素之一的 UDF