如何在Scala(spark)中打印String或String[Array]?
如何在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,以找出两行之间的差异。
问题的原因是,调用toString方法只是得到了一个字符串表示,而不是RDD的内容。要打印RDD的内容,需要先将所有数据传输到driver端。
解决方法是使用collect方法将RDD的内容收集到driver端,并使用foreach方法遍历每条记录,然后使用println方法打印出来。也可以使用mkstring方法将所有记录组合成一个字符串。
如果目标是比较两个RDD的内容,可以将它们转换为字符串,并使用split方法按照逗号分割,然后按照索引比较对应的单元格。
如果最终的数据量较小,可以使用collect方法将数据收集到driver端,然后使用标准的scala集合操作。如果数据量较大,可以考虑对两个RDD进行join操作,并过滤掉除了差异之外的所有内容。然后只查看前几个差异。
问题的出现原因是用户想要在Scala(Spark)中打印一个字符串或字符串数组,但他们并没有一个列表或数组。他们需要使用collect()
方法来获取一个RDD,或者通过foreach
方法迭代RDD。
此外,调用println
方法时,对象的toString方法已经被调用了。RDD没有mkString方法。
用户尝试打印一个名为n1的字符串,但实际上它是一个RDD,并且打印出了MapPartitionsRDD[32]。这正是RDD的toString方法返回的字符串类型变量的内容。用户似乎期望打印出RDD的其他内容,但实际上不会。用户可能没有理解RDD操作。
无论如何,即使那段代码能够工作,用户也需要对print1进行拆分,而不是对src进行拆分。
问题的原因是想要在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)
这是另一种修复方法。