2016-11-10 4 views
0
val filePath = "src/main/resources/millionsong.txt" 
val rdd = sc.textFile(filePath) 
val recordsRdd = rdd.map(line => line.split(",")) 
recordsRdd.foreach(println) 

私はScalaから始めています。なぜ出力があるのか​​理解していないのですか? 2001.0,0.884123733793,0.610454259079,0.600498416968,0.474669212493,0.247232680947,0.357306088914,0.344136412234,0.339641227335,0.600858840135,0.425704689024:116c19d8 @ ...スカラ線分割の問題

RDDの一つのラインがある。 ... [Ljava.lang.String 、0.60491501652,0.419193351817

出力は数値の配列でなければならないと思いますか?

+0

配列の典型的な 'toString'だという。おそらく、内容を見つけるために内部を見る必要があります。 – maasg

+0

Pythonの質問を聞いたので、PySparkを使わないのはなぜですか? –

答えて

2

正しいコードは次のようになります。

val filePath = "src/main/resources/millionsong.txt" 
val rdd = sc.textFile(filePath) 
val recordsRdd = rdd.flatMap(line => line.split(",")) 
recordsRdd.foreach(println) 

問題は、何をやっていることは、あなたがRDDにマッピングして、それゆえArray[String]に結果の文字列を分割しているということです、あなたはそうではありません先に平坦化するので、結果として生じるRDDは、タイプ:RDD[Array[String]]となる。したがって、recordsRdd.foreach(println)を使って印刷しようとすると、Arrayオブジェクトを印刷して奇妙な値を表示しようとします。

あなたは、アレイごとに値を印刷したい場合、これは次のように動作します:

val filePath = "src/main/resources/millionsong.txt" 
val rdd = sc.textFile(filePath) 
val recordsRdd = rdd.map(line => line.split(",")) 
recordsRdd.foreach(_.foreach(println)) 
-4

代わりにflatMapを使用してください。

1

String.splitArray[String]を返すので、配列を印刷しようとしています。 Scala配列は普通のJava配列なので、そのような読み取り不可能なtoStringがあります。達成したいことに応じて、record.Rdd.foreach(_.foreach(println))またはval recordsRdd = rdd.flatMap(line => line.split(","))のいずれかを使用する必要があります。 'Rdd'(Spark RDD?)のタイプがスカラコレクションと互換性があるかどうかは不明です。そうでなければ、flatMapは動作しません。値を印刷し