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

How to print a String or String[Array] in Scala(spark)?

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

1
MapPartitionsRDD[32]

我的代码如下:

更新时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,以找出两行之间的差异


在src上调用toString只是意味着您得到的字符串表示形式可以是任何东西。对于RDD,这不是RDD的内容(因为这将需要将RDD的所有内容都提供给驱动程序并立即打印)。

正如其他人提到的那样,为了打印RDD的内容,您需要首先将所有数据发送到驱动程序。

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

1
src.collect().foreach(println)

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


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

顺便说一下,

在任何对象上调用println已经为其调用了toString方法。而且RDD没有mkString方法


如果要查看RDD中的每条记录以单独的行打印,可以使用:

1
src.foreach(println)

这将在保存记录的执行程序(可能是几个不同的执行程序)内的每个记录上运行println函数。如果在使用Spark的"本地"模式的某些测试中运行此程序,则只有一个"执行程序",并且与驱动程序相同,因此这不是问题。

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

1
src.collect().foreach(println)

请注意,这假定RDD足够小,可以收集到单台计算机的内存中。

在RDD上调用toString不会访问RDD的数据(因为它可能太大而无法在驱动程序计算机的内存中容纳为String),因为您观察到它只是打印RDD的类型及其ID。