我知道有不同的方法来计算文本或列表中的元素数量。但我试图理解为什么这个不起作用。我正在尝试将等效代码写入
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)
答案 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中是否会发生同样的事情?我猜是这样的。