首页 > 解决方案 > Pyspark - 数据框中的动态 where 子句

问题描述

是否可以在数据框中执行动态“位置/过滤器”?我正在运行“喜欢”操作以删除与特定字符串匹配的项目

eventsDF.where(
    ~eventsDF.myColumn.like('FirstString%') &
    ~eventsDF.myColumn.like('anotherString%')
).count()

但是,我需要根据来自另一个数据框/列表的字符串进行过滤。

我想要的解决方案(实际上并不奏效)涉及一个接收索引的函数

#my_func[0] = "FirstString"
#my_func[1] = "anotherString"

def my_func(n):
   return str(item[n])

newDf.where(
   ~newDf.useragent.like(str(my_func(1))+'%')
).count()

但我正在努力通过传递一个范围来使其工作(主要是因为它是一个列表而不是一个整数)

newDf.where(
   ~newDf.useragent.like(str(my_func([i for i in range(2)])+'%'))
).count()

我不想走使用“exec”或“eval”执行它的路径

标签: pyspark

解决方案


str_likes = [~df.column.like(s) for s in strings]然后将其简化为一个表达式reduce(lambda x, y: x & y, str_likes)

它有点难看,但可以做你想做的。您也可以像这样在 for 循环中执行此操作

bool_expr = ~df.column.like(strings[0])
for s in strings[1:]:
    bool_expr &= ~df.column.like(s)
df.where(bool_expr).count()

推荐阅读