我正在尝试将集合的内容打印到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写入控制台或将其保存到磁盘,以便查看其内容?
9 回答
如果要查看RDD的内容,一种方法是使用
collect()
:但是,当RDD有数十亿行时,这不是一个好主意 . 使用
take()
只需打印几个:map
函数是一个转换,这意味着在您对其执行操作之前,Spark实际上不会评估您的RDD .要打印它,您可以使用
foreach
(这是一个动作):要将其写入磁盘,您可以使用RDD API中的一个
saveAs...
函数(静止动作)如果您在群集上运行此功能,则
println
将无法打印回您的上下文 . 您需要将RDD
数据带到会话中 . 为此,您可以将其强制为本地数组,然后将其打印出来:您可以将
RDD
转换为DataFrame
然后show()
它 .这将显示数据的前20行,因此数据大小不应成为问题 .
myRDD.foreach(println)
和myRDD.collect().foreach(println)
之间可能存在许多架构差异(不仅'collect',还有其他操作) . 我看到的差异之一是在做myRDD.foreach(println)
时,输出将是随机顺序 . 例如:如果我的rdd来自文本文件,其中每行都有一个数字,则输出将具有不同的顺序 . 但是当我做myRDD.collect().foreach(println)
时,订单仍然就像文本文件一样 .在python中
这将打印出RDD的所有内容
您也可以另存为文件:
rdd.saveAsTextFile("alicia.txt")
你可以;而不是每次都打字;
[1]在Spark Shell中创建一个通用的打印方法 .
[2]甚至更好,使用implicits,您可以将函数添加到RDD类以打印其内容 .
用法示例:
输出:
PS . 只有在本地模式下工作并且数据集很少时才有意义 . 否则,由于数据集结果较大,您将无法在客户端上看到结果或内存不足 .
和Spark更新的版本将很好地显示表 .