Значение аккумулятора всегда равно 0 - PullRequest
0 голосов
/ 20 мая 2019

Всегда получая значение Аккумулятора как 0.

package com.fast.processing.data

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object AccumulatorExample {
      def main(args:Array[String]){

      val spark = new SparkConf().setAppName("AccumulatorExample").setMaster("local")
      val sc = new SparkContext(spark)

      val data = sc.textFile("C:\\Users\\SportsData.txt")
      val badLines = sc.accumulator(0,"badLines");

      val datVal = data.foreach(line =>(line.split(",").map{x=>{
                  if(x(0).toInt < 0) badLines +=1
                }  
              }

      ) )
      println("Val of bad lines is:::"+badLines)
  }

}

Ниже приведены данные, и я ожидаю, что значение накопителя равно 4, так как каждая строка имеет первое значение меньше 0.

-1,10,India,2019,01-01-2019,Cricket,5,6,7,18 
-2,11,Japan,2018,01-01-2018,Football,6,6,6,18
-3,12,China,2017,01-01-2017,Tennis,7,7,7,21 
-4,13,India,2018,01-01-2017,Swimming,8,8,8,24 
A5,14,Bhutan,2019,01-01-2017,Swimming,5,5,5,25 
A5,14,Bhutan,2019,01-01-2017,Swimming,5,5,5,25 
A5,14,Bhutan,2019,01-01-2017,Swimming,5,5,5,25 
A5,14,Bhutan,2019,01-01-2017,Swimming,5,5,5,25 
  1. Элемент списка

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Проблема не в аккумуляторе, а здесь

if(x(0).toInt < 0)

x имеет тип String, поэтому x(0) относится к первому символу строки и toInt преобразует его в соответствующее значение кодовой точки, то есть 45 для -.

Есть много способов сделать это, например, это будет работать:

val datVal = data.foreach { line =>
  "^-\\d+,".r.findFirstMatchIn(line).foreach(_ => badLines += 1)
}

P.S. Метод Scala map не предназначен для побочных эффектов, вместо него следует использовать foreach.

0 голосов
/ 20 мая 2019

Вы также можете использовать фильтр для подсчета плохих записей, Вам не нужен аккумулятор

val result = data.filter(line => {
  Try {
    line.split(",")(0).toInt
  } match {
    case scala.util.Success(value) => false
    case _ => true
  }
})
println(result.count())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...