如何打印RDD的内容?

blu*_*sky 120 scala apache-spark

我正在尝试将集合的内容打印到Spark控制台.

我有一个类型:

linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]
Run Code Online (Sandbox Code Playgroud)

我使用命令:

scala> linesWithSessionId.map(line => println(line))
Run Code Online (Sandbox Code Playgroud)

但这是印刷的:

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

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

小智 221

如果要查看RDD的内容,可以使用collect()以下方法:

myRDD.collect().foreach(println)
Run Code Online (Sandbox Code Playgroud)

但是,当RDD有数十亿行时,这不是一个好主意.使用take()仅举几个打印出:

myRDD.take(n).foreach(println)
Run Code Online (Sandbox Code Playgroud)


fed*_*gon 48

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

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

linesWithSessionId.foreach(println)
Run Code Online (Sandbox Code Playgroud)

要将其写入磁盘,您可以使用RDD API中的一个saveAs...功能(静止操作)

  • 也许您需要提及`collect`以便RDD可以在控制台中打印. (6认同)
  • 上面的答案很糟糕.你不应该接受它.Foreach不会打印到控制台,它将在您的工作节点上打印.如果您只有一个节点,那么foreach将起作用.但是如果你只有一个节点,那你为什么要使用spark呢?只需使用SQL awk或Grep,或更简单的东西.所以我认为唯一有效的答案是收集.如果收集对你来说很大,你只需要一个样本使用take或head或simillar函数,如下所述. (6认同)
  • 实际上没有collect(),在foreach之前,我无法在控制台上看到任何东西. (5认同)
  • 实际上它在我的Spark shell中工作得很好,即使在1.2.0中也是如此.但我想我知道这个混乱的来源:最初的问题是如何将RDD打印到Spark控制台(= shell)所以我假设他会运行一个本地工作,在这种情况下`foreach`工作正常.如果您正在群集上运行作业并且想要打印您的rdd,那么您应该"收集"(如其他注释和答案所指出的),以便在执行`println`之前将其发送给驱动程序.如果您的RDD太大,使用Oussama建议的"take"可能是一个好主意. (3认同)

Noa*_*oah 12

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

linesWithSessionId.toArray().foreach(line => println(line))
Run Code Online (Sandbox Code Playgroud)


Wes*_*sam 11

您可以将转换RDDDataFrame然后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()
Run Code Online (Sandbox Code Playgroud)

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

+------+---+                                                                    
|    _1| _2|
+------+---+
| apple|  1|
|banana|  2|
|orange| 17|
+------+---+
Run Code Online (Sandbox Code Playgroud)