如何在Scala(spark)中打印String或String[Array]?

9 浏览
0 Comments

如何在Scala(spark)中打印String或String[Array]?

我试图对返回的字符串进行单元测试,但在尝试打印时,控制台输出了以下内容: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,以找出两行之间的差异。

0
0 Comments

问题的原因是,调用toString方法只是得到了一个字符串表示,而不是RDD的内容。要打印RDD的内容,需要先将所有数据传输到driver端。

解决方法是使用collect方法将RDD的内容收集到driver端,并使用foreach方法遍历每条记录,然后使用println方法打印出来。也可以使用mkstring方法将所有记录组合成一个字符串。

如果目标是比较两个RDD的内容,可以将它们转换为字符串,并使用split方法按照逗号分割,然后按照索引比较对应的单元格。

如果最终的数据量较小,可以使用collect方法将数据收集到driver端,然后使用标准的scala集合操作。如果数据量较大,可以考虑对两个RDD进行join操作,并过滤掉除了差异之外的所有内容。然后只查看前几个差异。

0
0 Comments

问题的出现原因是用户想要在Scala(Spark)中打印一个字符串或字符串数组,但他们并没有一个列表或数组。他们需要使用collect()方法来获取一个RDD,或者通过foreach方法迭代RDD。

此外,调用println方法时,对象的toString方法已经被调用了。RDD没有mkString方法。

用户尝试打印一个名为n1的字符串,但实际上它是一个RDD,并且打印出了MapPartitionsRDD[32]。这正是RDD的toString方法返回的字符串类型变量的内容。用户似乎期望打印出RDD的其他内容,但实际上不会。用户可能没有理解RDD操作。

无论如何,即使那段代码能够工作,用户也需要对print1进行拆分,而不是对src进行拆分。

0
0 Comments

问题的原因是想要在Scala(spark)中打印字符串或字符串数组,并将每个记录作为单独的行打印出来。解决方法是使用foreach函数或collect函数。

如果想要将RDD的每个记录作为单独的行打印出来,可以使用以下代码:

src.foreach(println)

这将在每个记录上运行println函数,在持有该记录的执行器中(可能是多个不同的执行器)。如果在使用Spark的"local"模式进行某个测试时运行此代码,则只有一个"执行器",它与驱动程序是同一个进程,所以这不是一个问题。

另外,如果有多个执行器(非本地模式)并且希望确保RDD的元素打印到驱动程序的控制台,可以首先将RDD的元素收集到本地集合中,然后再打印它们:

src.collect().foreach(println)

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

调用RDD的toString方法不会访问RDD的数据(因为数据可能过大而无法作为字符串放入驱动程序机器的内存中),正如你观察到的,它只打印RDD的类型和ID。

var n1:String = src.toString()
println(n1)

这是另一种修复方法。

0