我正在使用pyspark
。我有一个火花数据帧my_sdf
,其col1
是整数,我预定义了一个整数列表
S1 = [1,2,3,4]
然后我想返回my_sdf
中col1
集合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()
有多精确。
答案 0 :(得分:3)
你可以使用isin
对于您的问题,您可以尝试这样的事情:
from pyspark.sql.functions import col
Test1 = my_sdf.where(col("col1").isin(S1))
根据我的理解,缓存用于保存数据帧的当前值。这很有用,因为如果您想再次使用该数据帧,spark将从缓存中获取值,而不是从头开始再次计算。因此,如果您的代码只执行Test1.count
,那么缓存与否并不重要。 CMIIW