我正在尝试映射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: "?"
答案 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)