火花过滤器的奇怪行为

时间:2018-03-18 12:57:49

标签: python apache-spark pyspark rdd

C.collect()

我希望A中的所有数字都低于50并将它们放入B中,然后将所有数字从B中取出,并将它们放入C. 但是,m = 10 C = B.filter(lambda x: x > m) 的结果是空数组。

但是,如果我改变

t

它会正常工作。 我无法理解为什么,在此操作中它需要先前的var parent = element(by.css('.parent-class')); var child = element(by.css('.child-class')); parent.element(child.locator()).getText();

1 个答案:

答案 0 :(得分:4)

  

我无法理解为什么,在此操作中它需要先前的t值

其实 引用之前的t = 50 引用t = 10本身

如果你编写一个自定义函数来打印正在发生的事情,那就更明显了

A = sc.parallelize(xrange(1, 100))
t = 50
B = A.filter(lambda x: x < t)
B.collect()
t = 10
def filters(x):
    print x, t
    return x > t
C = B.filter(lambda x: filters(x))
print C.collect()

filters功能将打印如下

1 10
2 10
3 10
4 10
5 10
6 10
7 10
8 10
9 10

它显示 t为10 ,并且B = A.filter(lambda x: x < t) 再次调用t=10,即。 B现在有1到9 ,当调用.filter(lambda x: x > t)时,它会返回空列表 ,因为没有大于10的数字

正如Spark's official documentation也说

  
    

默认情况下,每次对其执行操作时,都可以重新计算每个转换后的RDD。但是,您也可以使用持久化(或缓存)方法在内存中保留RDD,在这种情况下,Spark会在群集上保留元素,以便在下次查询时更快地访问。还支持在磁盘上保留RDD,或在多个节点之间复制。