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

Count number of elements in a text or list using Spark

我知道有多种方法可以计算文本或列表中元素的数量。但我试图理解为什么这个不起作用。我正在尝试编写与

等效的代码
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) 

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

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

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

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