在 spark 中使用“in a set”子句过滤数据框

ftx*_*txx 4 python apache-spark pyspark

我正在使用pyspark. 我有一个整数的火花数据框my_sdfcol1我预定义了一个整数列表

S1 = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

然后我想返回set 中my_sdfwhere 中的行。所以我做了以下事情:col1S1

Test1 = my_sdf.filter(my_sdf.col1 in S1).cache()
# or Test1 = my_sdf.filter(my_sdf.col1 not in S1).cache()
Test1.count()
Run Code Online (Sandbox Code Playgroud)

但它返回

ValueError: 无法将列转换为 bool: 请使用 '&' 表示 'and', '|' 在构建 DataFrame 布尔表达式时,为“or”,“~”为“not”。

我不知道如何解决这个问题。最终,我想开始S1 = []成为一个空列表作为我迭代和循环期间的起点,我将更新S1. 同样,not in S1也不起作用。我试着写

Test1 = my_sdf.filter((my_sdf.col1 <10) & (my_sdf.col1>2)).cache()
Run Code Online (Sandbox Code Playgroud)

它有效,但如果我使用过滤条件in S1,则它不起作用。

另一个问题是:这个cache()东西在做什么?如果我不放那会有什么不同吗?有人告诉我 spark 是lazy用来评估代码的,所以在我调用之前Test.count(),它实际上并没有执行之前的过滤命令。但我不确定这有多准确cache()

Ari*_*owo 5

你可以使用 isin

对于您的问题,您可以尝试以下操作:

from pyspark.sql.functions import col

Test1 = my_sdf.where(col("col1").isin(S1))

根据我的理解,缓存用于保存数据帧的当前值。这很有帮助,因为如果您想再次使用该数据帧,spark 将从缓存中获取值,而不是从头开始再次计算。所以,如果你的代码只做Test1.count,那么缓存与否并不重要。CMIIW