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

Pyspark 使用Spark计算文本或列表中的元素数,pyspark,accumulator,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(u),但我不知道如何得到结果。A_RDD.foreach(我的计数)不做任何事情。我也没

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

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(u),但我不知道如何得到结果。A_RDD.foreach(我的计数)不做任何事情。我也没有收到任何错误。我做错了什么

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
方法与变量
计数器一起发送到每个执行器节点,因为该方法引用变量。因此,每个执行器节点都会获得自己的
计数器
变量定义,该变量由foreach方法更新,而驱动程序应用程序中定义的
计数器
变量不会增加

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

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

那么,如果您在本地运行,而不是在集群上运行,该怎么办呢。在spark/scala中,这种行为在本地和集群之间变化。它会有一个本地预期的值,但在集群中它不会有与您描述的相同的值。。。在spark/python中,是否也会发生同样的情况?我猜是的。

Mary,你能确认贴出的答案是否澄清了你的问题吗?