如何正确打印rdd

时间:2016-12-28 06:47:02

标签: scala apache-spark

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

(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@72031368))
(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@27ef4b52))

我的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       gavin   2       22      20      85      78
200412169       gavin   1       24      60      85      78

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

2 个答案:

答案 0 :(得分:6)

奇怪的打印是在Java数组上调用{ "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "myNewRemoteMethod", "accessType": "EXECUTE" } 的结果。要获得一个很好的以制表符分隔的打印输出,您可以将每个记录映射到符合您喜好的字符串,如:

toString

或者,如果您确实想要保留RDD的结构,只需在打印时看到它的正确表示,您只需使用Scala列表转换数组(带有不那么有用的toString): / p>

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

答案 1 :(得分:0)

您正在查看结果(200412169,([Ljava.lang.String;@7515eb2d,[Ljava.lang.String;@72031368)) 只是因为它调用tostring,但在Scala中查看RDD的结果,您必须使用mkString

如果要查看RDD的内容,一种方法是使用collect()

myRDD.collect().foreach(println)

当RDD有更多行使用take()时只打印少量。

myRDD.take(n).foreach(println)

示例:

val input=sc.parallelize(List(1,2,3,4,5))
print(input.collect().mkString(","))

结果: enter image description here