PySpark DataFrame数组多值匹配场景下如何实现case when逻辑
你可以通过以下两种单语句方案实现需求:
方法1:使用arrays_overlap函数(最简洁,Spark 2.4+支持)
该函数的作用是判断两个数组是否存在共同元素,刚好匹配“只要数组包含任意一个目标值就返回真”的逻辑,写法和你预期的伪代码非常接近:
test = test.withColumn("my_boolean", F.when(expr("arrays_overlap(check_variable, array('a','b'))"), 1) .otherwise(0))
注意你之前的代码里把列名check_variable加了单引号会被识别为字符串常量,需要去掉引号才能正确读取列值。
方法2:使用exists高阶函数(Spark 2.4+支持)
如果后续需要扩展更复杂的匹配规则,可以用exists遍历数组元素判断:
test = test.withColumn("my_boolean", F.when(expr("exists(check_variable, x -> x in ('a', 'b'))"), 1) .otherwise(0))
如果你需要判断数组同时包含所有目标值,可以用array_intersect取两个数组的交集,再判断交集长度是否等于目标值数量即可:
# 示例:判断是否同时包含a和b test = test.withColumn("my_boolean", F.when(expr("size(array_intersect(check_variable, array('a','b'))) = 2"), 1) .otherwise(0))
内容的提问来源于stack exchange,提问作者safex
相关产品推荐
相关产品推荐

