如何正确打印rdd

lin*_*uan 2 scala apache-spark

对不起,我是一个新的学习者,现在我想以正确的格式打印一个rdd,但结果是这样的:

(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@72031368))
(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@27ef4b52))
Run Code Online (Sandbox Code Playgroud)

我的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))), 
  )
Run Code Online (Sandbox Code Playgroud)

我想打印出来:

200412169       gavin   2       22      20      85      78
200412169       gavin   1       24      60      85      78
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我,非常感谢.

Tza*_*har 6

奇怪的打印是调用toStringJava数组的结果.要获得一个很好的以制表符分隔的打印输出,您可以将每个记录映射到符合您喜欢的字符串,例如:

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
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实想要保留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))
Run Code Online (Sandbox Code Playgroud)