如何在 Scala(spark) 中打印字符串或字符串 [Array]?

Posted

技术标签:

【中文标题】如何在 Scala(spark) 中打印字符串或字符串 [Array]?【英文标题】:How to print a String or String[Array] in Scala(spark)? 【发布时间】:2017-05-08 11:28:51 【问题描述】:

我正在尝试对字符串中返回的值进行单元测试,但是当我尝试打印时,控制台给出了

MapPartitionsRDD[32]

我的代码如下:

更新:

val src = exact_bestmatch_src.filter(line => line.split(",")(0).toInt.equals(i))
val dest = exact_bestmatch_Dest.filter(line => line.split(",")(0).toInt.equals(i)).toArray()

 for (print1 <- src)        
    var n1:String = src.toString()       
    var sourceArr: Array[String] = n1.split(",")


    for (print2 <- dest)         
      var n2: String = dest.toString()

      for (i <- 0 until sourceArr.length)           
        if (n1.split(",")(i).equals(n2.split(",")(i))) 


        
      

我也试过println(n1.mkstring())

我正在尝试比较 src 和 dest RDD 以找出两行之间的差异

【问题讨论】:

How to print the contents of RDD?的可能重复 【参考方案1】:

如果您想将 RDD 中的每条记录打印为单独的行,您可以使用:

src.foreach(println)

这将在每条记录上运行println 函数,在持有它的执行器中(可能是几个不同的执行器)。如果这在使用 Spark 的“本地”模式的某些测试中运行,则只有一个“执行程序”,并且它与驱动程序的进程相同,所以这不是问题。

或者,如果您确实有多个执行程序(非本地模式)并且您想确保将 RDD 的元素打印到 driver 控制台,您可以首先collect 将 RDD 的元素放入本地集合中,然后打印它们:

src.collect().foreach(println)

注意,这假设 RDD 足够小,可以收集到单个机器的内存中。

在 RDD 上调用 toString 不会访问 RDD 的 data(因为它可能太大而无法在驱动程序机器的内存中作为字符串容纳),正如您观察到的那样,它只会打印 类型 RDD 及其 ID。

【讨论】:

var n1:String = src.toString() | println(n1) 还有其他解决方法吗?【参考方案2】:

您没有列表或数组。您需要 collect() 一个 RDD 才能获得一个,或者您需要通过 foreach 对其进行迭代。

顺便说一句,在任何对象上调用println 已经为它调用了toString 方法。而且RDD没有mkString方法

【讨论】:

我正在尝试打印不是 RDD 它的字符串的 n1 但它的打印 MapPartitionsRDD[32] 这正是您的 RDD 上的 toString 的内容,它返回一个字符串类型变量...我不知道您在期待什么实际打印出 RDD 我认为您不了解 RDD 操作。 for (print1 &lt;- src) 不正确循环一个 无论如何,即使该代码有效,您也需要拆分print1,而不是src【参考方案3】:

在 src 上调用 toString 仅仅意味着你得到了一个可以是任何东西的字符串表示。对于 RDD,这不是 RDD 的内容(因为这需要将 RDD 的所有内容获取到驱动程序并立即打印出来)。

正如其他人提到的,为了打印 R​​DD 的内容,您需要首先将所有数据获取到驱动程序。

让我们考虑一下已经提出的简单解决方案:

src.collect().foreach(println)

第一部分 - collect 告诉 spark 获取 RDD 的所有内容并将其作为记录序列提供给驱动程序。 foreach 告诉 scala 遍历序列中的每条记录,并将其作为参数传递给 println 函数,该函数将打印它。您当然可以使用 mkstring 而不是 foreach 来获取单个字符串。

【讨论】:

感谢您的评论,为了比较源和目标 RDD,我应该将其设置为如下字符串 if (n1.split(",")(i).equals(n2.split (",")(i))) 或者是否有任何方法可以将源单元格和目标单元格与其对应的索引进行比较(即,源的第 0 列应该与目标的第 0 列进行比较,同样适用于剩余的列 这取决于您的确切目标。如果您的最终数据(在所有操作之后)很小,那么您可以简单地使用 collect 将其带到驱动程序并使用标准 scala 收集操作。如果数据很大,您应该考虑在两者之间进行连接并过滤除差异之外的所有内容。然后你可以只看前几个差异

以上是关于如何在 Scala(spark) 中打印字符串或字符串 [Array]?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Scala 中读取带有根元素的多行 json?

如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?

如何使用scala在Apache spark中用空字符串(“”)替换空值[重复]

如何打印 spark dataframe

如何在 Scala(Spark 2.0)中将带有字符串的 DataFrame 转换为带有 Vectors 的 DataFrame

scala-spark实现重分区和打印各个分区的data