首页 文章

如何打印RDD的内容?

提问于
浏览
99

我正在尝试将集合的内容打印到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 回答

  • 1

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

    myRDD.collect().foreach(println)
    

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

    myRDD.take(n).foreach(println)
    
  • 8

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

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

    linesWithSessionId.foreach(println)
    

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

  • 1

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

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

    您可以将 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|
    +------+---+
    
  • 45

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

  • 0

    在python中

    linesWithSessionIdCollect = linesWithSessionId.collect()
       linesWithSessionIdCollect
    

    这将打印出RDD的所有内容

  • 1

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

  • 11

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

    [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 . 只有在本地模式下工作并且数据集很少时才有意义 . 否则,由于数据集结果较大,您将无法在客户端上看到结果或内存不足 .

  • 1
    c.take(10)
    

    和Spark更新的版本将很好地显示表 .

相关问题