使用Spark计算文本或列表中的元素数

时间:2017-06-05 23:20:35

标签: pyspark accumulator

我知道有不同的方法来计算文本或列表中的元素数量。但我试图理解为什么这个不起作用。我正在尝试将等效代码写入

A_RDD=sc.parallelize(['a', 1.2, []])

acc = sc.accumulator(0)
acc.value
A_RDD.foreach(lambda _: acc.add(1))
acc.value

结果为3。 为此,我定义了以下函数my_count(_),但我不知道如何获得结果。 A_RDD.foreach(my_count)没有做任何事情。我也没有收到任何错误。我做错了什么?

counter = 0   #function that counts elements
def my_count(_):
    global counter
    counter += 1

A_RDD.foreach(my_count) 

2 个答案:

答案 0 :(得分:1)

A_RDD.foreach(my_count)操作不会在您的本地Python虚拟机上运行。它在远程执行程序节点中运行。因此,驱动器将my_count方法与变量counter一起发送到每个执行程序节点,因为该方法引用了变量。因此,每个执行程序节点都获得自己的counter变量定义,该变量由foreach方法更新,而驱动程序应用程序中定义的counter变量不会增加。

一个简单但有风险的解决方案是在您的驱动程序上收集RDD,然后计算如下的计数。这是有风险的,因为整个RDD内容被下载到驱动程序的内存中,这可能导致MemoryError。

>>> len(A_RDD.collect())
3

答案 1 :(得分:0)

那么如果您在本地运行而不在群集上运行会怎样。在spark / scala中,此行为在本地和clust之间发生变化。它将具有本地预期的值,但在集群中它将不会像您描述的那样具有相同的值...在spark / python中是否会发生同样的事情?我猜是这样的。