2017-08-12 77 views
-2

RDDjava.lang.NumberFormatException:對於輸入字符串的同時改造RDD

scala> val rdd = sc.parallelize(List(("A",1), ("A",2), ("B",1), ("A",3), ("B",2))) 
rdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[806] at parallelize at <console>:30 

轉型

scala> rdd.map(r => r.toString.split(',')).map(r => (r(0), r(1).toInt)).collect() 

同時改造這個RDD使用地圖我獲得以下錯誤:

17/08/12 12:22:18 ERROR executor.Executor: Exception in task 2.0 in stage 161.0 (TID 7031) 
java.lang.NumberFormatException: For input string: "1)" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 

回答

0

這是因爲y OU不應該使用的toString :)從您的代碼:

rdd.map(r => r.toString.split(',')) 

這裏元組(A, B)被映射到字符串(A, B),然後你把它分解成(AB)。有趣的是,rdd快速已經輸入RDD[(String, Int)] :)

相反,你不應該使用toString和這個映射函數。你也可以這樣做:

rdd.map(r=> r.toString.replaceAll("(", "").replaceAll(")", "").split(",")) 

所以,你將取代()與空字符串從輸入字符串

0

的問題是,你正試圖在額外的括號導致NumberFormatException異常來1)轉換爲數字。

嘗試將r.toString.split(',').map(r => (r(0), r(1).toInt)).collect()更改爲r.map(r => (r(0), r(1).toInt)).collect()並查看是否修復該問題。

0

你的最後一步,表明你正在創建RDD[Tuple2(String, Int)]

但是你第一步已經創建RDD[tuple2(String, Int)]這是一個tupletuple越來越元素被完成。 _1 , ._2

scala> val rdd = sc.parallelize(List(("A",1), ("A",2), ("B",1), ("A",3), ("B",2))) 
rdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[0] at parallelize at <console>:25 

所以我想你不會在第二個參數作爲它已經是一個Int需要.toInt。這樣做下面應該工作

scala> rdd.map(r => (r._1, r._2)).collect 
res0: Array[(String, Int)] = Array((A,1), (A,2), (B,1), (A,3), (B,2)) 

如果您還包括.toInt,它仍然會工作

scala> rdd.map(r => (r._1, r._2.toInt)).collect 
res1: Array[(String, Int)] = Array((A,1), (A,2), (B,1), (A,3), (B,2)) 

所以tuple2轉換爲字符串和分裂的字符串轉換爲原來的形式會,我猜,僅供測試之用。

如果那那麼原因,當tuple2.toString()括號也包括其中需要去除轉換爲String。所以正確的方法做你的第二步將是

scala> rdd.map(r => r.toString().replaceAll("[()]", "").split(",")).map(r => (r(0), r(1).toInt)).collect 
res2: Array[(String, Int)] = Array((A,1), (A,2), (B,1), (A,3), (B,2)) 
相關問題