2017-08-12 7 views
-2

RDDjava.lang.NumberFormatException:マップを使用して、このRDDを変換しながら、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() 

を変換しながら、入力文字列のために私はエラーを次取得:

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)が、あなたは(AB)に分割文字列(A, B)にマッピングされているタプル。非常に面白い、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)]

を作成しているしかし、あなたの最初のステップはすでにによって行われtupletupleと Scalaので取得要素であるRDD[tuple2(String, Int)]を作成したことを示唆しています。 _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として、2番目のパラメータで.toIntを必要としませんね。そう、次はあなたがまだ.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を変換するには、私が推測する元の形に変換していきます

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

動作するはずですテスト目的にのみ使用してください。

場合tuple2を除去する必要も含まれ.toString()ブラケットによってStringに変換され、次に理由、厥。したがって、2番目のステップを実行する正しい方法は、

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)) 
です
関連する問題