Pyspark-数据框架中的动态where子句

时间:2018-07-11 00:01:22

标签: pyspark

是否可以在数据帧中执行动态“ where / filter”? 我正在执行“喜欢”操作,以删除与特定字符串匹配的项目

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”执行它的路径

1 个答案:

答案 0 :(得分:2)

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()