Scala线分裂问题

时间:2016-11-10 01:14:46

标签: scala

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

我刚开始使用Scala。我不明白为什么输出? ... [Ljava.lang.String; @ 116c19d8 ...

Rdd的一行是: 2001.0,0.884123733793,0.610454259079,0.600498416968,0.474669212493,0.247232680947,0.357306088914,0.344136412234,0.339641227335,0.600858840135,0.425704689024,0.60491501652,0.419193351817

我在想输出应该是数组?

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

String.split返回Array[String],因此您正在尝试打印数组。 Scala数组是普通的java数组,这就是为什么它有这样的不可读的toString。根据您要实现的目标,您应该使用record.Rdd.foreach(_.foreach(println))val recordsRdd = rdd.flatMap(line => line.split(","))。不确定某种类型的'Rdd'(Spark RDD?)是否与scala集合兼容。如果不是,则flatMap将无效。

答案 2 :(得分:-4)

使用flatMap代替rdd。