过滤火花使用中的数据帧"在一组"条款

时间:2017-02-10 02:03:50

标签: python apache-spark pyspark

我正在使用pyspark。我有一个火花数据帧my_sdf,其col1是整数,我预定义了一个整数列表

S1 = [1,2,3,4]

然后我想返回my_sdfcol1集合S1中的行。所以我做了以下事情:

Test1 = my_sdf.filter(my_sdf.col1 in S1).cache()
# or Test1 = my_sdf.filter(my_sdf.col1 not in S1).cache()
Test1.count()

但它返回

ValueError:无法将列转换为bool:请使用'&'为'和',' |'对于'或','〜'因为'不是'在构建DataFrame布尔表达式时。

我不知道如何解决这个问题。最后,我想将S1 = []作为一个空列表作为迭代的起点,在循环过程中,我将更新S1。同样,not in S1也不起作用。我试过写

Test1 = my_sdf.filter((my_sdf.col1 <10) & (my_sdf.col1>2)).cache()

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

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

1 个答案:

答案 0 :(得分:3)

你可以使用isin

对于您的问题,您可以尝试这样的事情:

from pyspark.sql.functions import col

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

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