如何打印RDD的内容?

时间:2014-04-19 17:54:31

标签: scala apache-spark

我试图将集合的内容打印到Spark控制台。

我有一个类型:

linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]

我使用命令:

scala> linesWithSessionId.map(line => println(line))

但这是印刷的:

  

res1:org.apache.spark.rdd.RDD [Unit] = MappedRDD [4] at map at:19

如何将RDD写入控制台或将其保存到磁盘,以便查看其内容?

10 个答案:

答案 0 :(得分:211)

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

myRDD.collect().foreach(println)
但是,当RDD有数十亿行时,这不是一个好主意。使用take()只需打印几张即可:

myRDD.take(n).foreach(println)

答案 1 :(得分:46)

map函数是转换,这意味着在您对其运行操作之前,Spark实际上不会评估您的RDD。

要打印它,您可以使用foreach(这是一个动作):

linesWithSessionId.foreach(println)

要将其写入磁盘,您可以使用RDD API

中的saveAs...个功能之一(静止操作)

答案 2 :(得分:11)

如果您在群集上运行此功能,则println将无法打印回您的上下文。您需要将RDD数据带到会话中。为此,您可以将其强制为本地数组,然后将其打印出来:

linesWithSessionId.toArray().foreach(line => println(line))

答案 3 :(得分:10)

您可以将RDD转换为DataFrame,然后转换为show()

// For implicit conversion from RDD to DataFrame
import spark.implicits._

fruits = sc.parallelize([("apple", 1), ("banana", 2), ("orange", 17)])

// convert to DF then show it
fruits.toDF().show()

这将显示数据的前20行,因此数据大小不应成为问题。

+------+---+                                                                    
|    _1| _2|
+------+---+
| apple|  1|
|banana|  2|
|orange| 17|
+------+---+

答案 4 :(得分:2)

不是每次都打字,而是可以;

[1]在Spark Shell中创建一个通用的打印方法。

def p(rdd: org.apache.spark.rdd.RDD[_]) = rdd.foreach(println)

[2]或者甚至更好,使用implicits,您可以将函数添加到RDD类来打印其内容。

implicit class Printer(rdd: org.apache.spark.rdd.RDD[_]) {
    def print = rdd.foreach(println)
}

使用示例:

val rdd = sc.parallelize(List(1,2,3,4)).map(_*2)

p(rdd) // 1
rdd.print // 2

输出:

2
6
4
8

PS。只有在本地模式下工作并且数据集很少时才有意义。否则,由于数据集结果较大,您将无法在客户端上看到结果或内存不足。

答案 5 :(得分:1)

myRDD.foreach(println)myRDD.collect().foreach(println)之间可能存在许多架构差异(不仅是' collect'还有其他操作)。我看到的差异之一是在执行myRDD.foreach(println)时,输出将是随机顺序。例如:如果我的rdd来自文本文件,其中每行都有一个数字,则输出将具有不同的顺序。但是当我myRDD.collect().foreach(println)时,订单仍然就像文本文件一样。

答案 6 :(得分:1)

在python中

   linesWithSessionIdCollect = linesWithSessionId.collect()
   linesWithSessionIdCollect

这将打印出RDD的所有内容

答案 7 :(得分:1)

您也可以另存为false

答案 8 :(得分:0)

c.take(10)

和Spark的较新版本将很好地显示表格。

答案 9 :(得分:0)

使用Java语法:

rdd.collect().forEach(line -> System.out.println(line));