实现一个带有字典项和两个列值的CASE WHEN语句,若匹配则返回true

编程语言 2026-07-09

有没有办法在数据帧中用两列的值来与字典项进行比较?

示例:

dic = [ (a,1),(b,2),(c,3) ]

以下是数据帧,input_dataframe 仅包含 nameid 两列。

output_dataframe 拥有名为 flag 的列。它比较a 与b 两列的值,如果两者都出现在字典项中,则在 flag 列返回true。

此处输入图片描述

我实现了如下所示的case when:

 df = df.withColumn(
                    flag,
                    when(struct(col("a"), col("b")).isin(dic), lit('True'))

                    .otherwise(lit("False"))
                    )

但它给出如下错误:

在验证时发生错误:user_dw_pnldetail错误: [UNSUPPORTED_FEATURE.LITERAL_TYPE] 该特性不被支持: 字面量 '[a, 1]' 属于java.util.ArrayList类。SQLSTATE: 0A000

有人能帮我修复这个错误吗?

解决方案

dic 转换为字符串列表,方法是用指定分隔符字符串(####)将其元素连接起来;同样,使用相同的分隔符连接 nameid 两列中的值;最后,使用 isin 函数来比较这两条结果列表是否相同。

from pyspark.sql import functions as F

...
str_ls = [i[0] + '####' + str(i[1]) for i in dic]
df = df.select('*', F.when(F.concat('name', F.lit('####'), 'id').isin(str_ls), True).otherwise(False).alias('flag'))
df.show()
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章