Scala 如何正确打印rdd
对不起,我是spark的新学员,现在我想以正确的格式打印rdd,但结果如下:Scala 如何正确打印rdd,scala,apache-spark,Scala,Apache Spark,对不起,我是spark的新学员,现在我想以正确的格式打印rdd,但结果如下: (200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@72031368)) (200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@27ef4b52)) 200412169 gavin 2 22 20 85 78 2004121
(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@72031368))
(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@27ef4b52))
200412169 gavin 2 22 20 85 78
200412169 gavin 1 24 60 85 78
我的rdd是
Array[(String, (Array[String], Array[String]))] =
Array(
(200412169,(Array(gavin),Array(1, 24, 60, 85, 78))),
(200412169,(Array(gavin),Array(2, 22, 20, 85, 78))),
(200412166,(Array(gavin3),Array(1, 54, 80, 78, 98))),
)
我想把它打印成这样:
(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@72031368))
(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@27ef4b52))
200412169 gavin 2 22 20 85 78
200412169 gavin 1 24 60 85 78
有人可以帮我,非常感谢。奇怪的打印是在Java数组上调用
toString
的结果。要获得一个很好的制表符分隔打印输出,您可以将每条记录映射到一个字符串中,该字符串的格式符合您的喜好,例如:
rdd.map { case (a, (arr1, arr2)) => (a +: arr1) ++ arr2 } // "flatten" into single array
.map(_.mkString("\t")) // combine into Tab-separated string
.foreach(println)
// 200412166 gavin3 1 54 80 78 98
// 200412169 gavin 2 22 20 85 78
// 200412169 gavin 1 24 60 85 78
或者,如果您确实希望保留RDD的结构,只需在打印时查看它的正确表示,您可以简单地使用Scala列表转换数组(及其不太有用的toString):
rdd.map { case (a, (arr1, arr2)) => (a, arr1.toList, arr2.toList) }
.foreach(println)
// (200412169,List(gavin),List(1, 24, 60, 85, 78))
// (200412166,List(gavin3),List(1, 54, 80, 78, 98))
// (200412169,List(gavin),List(2, 22, 20, 85, 78))
您正在查看结果
(200412169,([Ljava.lang.String;@7515eb2d[Ljava.lang.String;@72031368])
这只是因为它调用了tostring
,但在Scala中查看RDD
的结果时,必须使用mkString
如果要查看RDD的内容,一种方法是使用collect()
当RDD有更多行时,使用take()
只打印很少的行
myRDD.take(n).foreach(println)
例如:
val input=sc.parallelize(List(1,2,3,4,5))
print(input.collect().mkString(","))
结果:
可能存在的副本