在pyspark的全球柜台

时间:2016-11-29 18:49:51

标签: apache-spark pyspark

为什么我用pyspark下面写的这个计数器并不总能为我提供正确的结果,它与全局计数器有关吗?

def increment_counter():
    global counter
    counter += 1

def get_number_of_element(rdd):
    global counter
    counter = 0
    rdd.foreach(lambda x:increment_counter())
    return counter

1 个答案:

答案 0 :(得分:5)

您的全局变量仅在驱动程序节点上定义,这意味着它将在localhost上运行之前正常工作。 只要您将作业分发到多个进程,他们就无法访问counter变量,只会在自己的进程中创建一个新变量。因此,最终结果将只包含在驱动程序进程中完成的增量。

您正在寻找的是一种非常常见的用法,并且由Spark的累加器功能涵盖。累加器在过程结束时分发和收集,因此总计将包含所有节点的增量,而不仅仅包含驱动程序节点。

Accumulators - Spark Programming Guide