我试图将集合的内容打印到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写入控制台或将其保存到磁盘,以便查看其内容?
答案 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));