Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何正确打印rdd_Scala_Apache Spark - Fatal编程技术网

Scala 如何正确打印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

对不起,我是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
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(","))
结果:

可能存在的副本