实现一个带有字典项和两个列值的CASE WHEN语句,若匹配则返回true
有没有办法在数据帧中用两列的值来与字典项进行比较?
示例:
dic = [ (a,1),(b,2),(c,3) ]
以下是数据帧,input_dataframe 仅包含 name 和 id 两列。
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 转换为字符串列表,方法是用指定分隔符字符串(####)将其元素连接起来;同样,使用相同的分隔符连接 name 与 id 两列中的值;最后,使用 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。