Spark Accumulator无法正常工作

时间:2018-02-04 18:02:54

标签: apache-spark pyspark accumulator hortonworks-sandbox

我希望使用累加器从this数据中获取已关闭订单的数量。但它给了我不正确的答案,只有零(0)。问题是什么?我正在使用Hortonworks Sandbox。代码如下。我正在使用spark-submit。

from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName('closedcount')
sc   =  SparkContext(conf=conf)
rdd = sc.textFile("/tmp/fish/itversity/retail_db/orders/")
N_closed = sc.accumulator(0)
def is_closed(N_closed, line):
  status =(line.split(",")[-1]=="CLOSED")
  if status:
    N_closed.add(1)
  return status
closedRDD = rdd.filter(lambda x: is_closed(N_closed, x))
print('The answer is ' + str(N_closed.value))

但是当我提交它时,我得到零。

 spark-submit --master yarn closedCounter.py

enter image description here

更新

现在,当我更改我的代码时,它工作正常。这是正确的方法吗?

from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName('closedcount')
sc   =  SparkContext(conf=conf)
rdd = sc.textFile("/tmp/fish/itversity/retail_db/orders/")
N_closed = sc.accumulator(0)
def is_closed(line):
  global N_closed
  status =(line.split(",")[-1]=="CLOSED")
  if status:
    N_closed.add(1)

rdd.foreach(is_closed)
print('The answer is ' + str(N_closed.value))

enter image description here

第二次更新:

我现在明白了,在Jupyter Notebook中,没有Yarn,它给了我正确的答案,因为我在检查累加器的值之前调用了一个动作(计数)。 enter image description here

1 个答案:

答案 0 :(得分:1)

  

转换中的计算被懒惰地评估,因此除非在RDD上发生动作,否则不执行转换。因此,除非在RDD上发生某些操作,否则不会执行map()或filter()等函数内部使用的累加器

https://www.edureka.co/blog/spark-accumulators-explained

(Scala中的示例)

但基本上,您需要对rdd执行操作。

例如

N_closed = sc.accumulator(0)
def is_closed(line):
    status = line.split(",")[-1]=="CLOSED"
    if status:
        N_closed.add(1)
    return status

rdd.foreach(is_closed)
print('The answer is ' + str(N_closed.value))