Apache Spark reduceByKey为小数点和

时间:2015-09-08 07:44:12

标签: scala apache-spark apache-spark-sql

我正在尝试映射RDD(请参阅结果输出)并按小数值映射reduce,我不断收到错误。当我尝试使用带字数的reduceByKey()时,它运行正常。十进制值是否以不同方式求和?

val voltageRDD= myRDD.map(i=> i.split(";"))
   .filter(i=> i(0).split("/")(2)=="2008")
   .map(i=> (i(0).split("/")(2),i(2).toFloat)).take(5)

输出:

voltageRDD: Array[(String, Float)] = Array((2008,1.62), (2008,1.626), (2008,1.622), (2008,1.612), (2008,1.612))

尝试减少时:

val voltageRDD= myRDD.map(i=> i.split(";"))
   .filter(i=> i(0).split("/")(2)=="2008")
   .map(i=> (i(0).split("/")(2),i(2).toFloat)).reduceByKey(_+_).take(5)

我收到以下错误:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 2954.0 failed 4 times, most recent failure: Lost task 0.3 in stage 2954.0 (TID 15696, 10.19.240.54): java.lang.NumberFormatException: For input string: "?"

2 个答案:

答案 0 :(得分:1)

简短版本:您可能有i(2)等于?的行。

根据我的评论,您的数据很可能不一致,因为take(5)并且没有需要火花来执行整体操作的行动,因此在第一个片段中不会出现问题数据集。 Spark是懒惰的,因此只会在5链获得map -> filter -> map结果之前执行计算。

另一方面,第二个片段将对您的整个数据集执行计算,以便它可以执行reduceByKey,然后只需要5个结果,因此它可能会捕获数据集中太远的问题第一个片段。

答案 1 :(得分:1)

如果您的数据包含不能浮动的列,那么您应该事先将它们过滤掉或者相应地处理它们。如果您看到不可解析的条目,则此类处理可能意味着您分配值0.0f。以下代码就是这样做的。

val voltageRDD= myRDD.map(i=> i.split(";"))
  .filter(i => i(0).split("/")(2)=="2008")
  .map(i => (i(0).split("/")(2), Try{ i(2).toFloat }.toOption.getOrElse(0.0f)))
  .reduceByKey(_ + _).take(5)