如何打印 RDD 的内容?

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

我喜欢一种类型:

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

我用这个命令:

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

但这是印刷品:

Res1: org.apache.spot.rdd.RDD [ Unit ] = MappedRDD [4] at map at: 19

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

301670 次浏览

map函数是 转换函数,这意味着 Spark 在运行 行动函数之前不会真正计算 RDD。

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

linesWithSessionId.foreach(println)

要将其写入磁盘,可以使用 RDD API中的一个 saveAs...函数(静止动作)

如果您在集群上运行这个命令,那么 println将不会打印回您的上下文。您需要将 RDD数据带到您的会话中。要做到这一点,你可以强制它到本地数组,然后打印出来:

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

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

myRDD.collect().foreach(println)

但是,当 RDD 有数十亿行时,这不是一个好主意。使用 take()打印几张图片:

myRDD.take(n).foreach(println)

myRDD.foreach(println)myRDD.collect().foreach(println)之间可能存在许多架构上的差异(不仅仅是“收集”,还有其他操作)。我看到的一个不同之处是,当执行 myRDD.foreach(println)时,输出将是随机顺序的。对于 ex: 如果我的 rdd 来自一个文本文件,其中每一行都有一个数字,那么输出将有不同的顺序。但是当我执行 myRDD.collect().foreach(println)时,顺序仍然和文本文件一样。

在巨蟒里

   linesWithSessionIdCollect = linesWithSessionId.collect()
linesWithSessionIdCollect

这将打印出 RDD 的所有内容

也可以另存为文件: rdd.saveAsTextFile("alicia.txt")

你可以不用每次都打字;

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

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

[2]或者更好的是,使用隐式,您可以将函数添加到 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

很重要

只有在使用本地模式并使用少量数据集时,这才有意义。否则,您将无法在客户端上看到结果,或者由于大数据集结果而导致内存不足。

你可以把你的 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|
+------+---+
c.take(10)

和火花新版本将显示表很好。

在 java 语法中:

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