scala - 如何在 Spark 中编写干净的调试语句?

标签 scala apache-spark

随着我的 Spark 应用程序的增长,我注意到由于实际代码与仅在 Debug模式下执行的代码混合在一起,它变得越来越难以阅读。

newRDD = doSomething(initialRDD)
if (debugMode) {
    newRDD.cache
    newRDD.foreach { row => logDebug("Rows of newRDD: " + row.toString.substring(0, 200)) }
    doMoreStuff()
}
finalRDD = doSomethingElse(newRDD)
finalRDD.count
logInfo("Part 1 completed")

解决这种情况的最佳方法是什么?

最佳答案

这是我为此目的使用的一个技巧,使用“增强我的库”模式:

// add "wrapper" class for RDD with new printDebugRecords method:
class RDDDebugFunction[K](rdd: RDD[K]) {

  def printDebugRecords(msgFormat: K => String): RDD[K] = {
    if (isDebugMode) {
      rdd.cache
      rdd.foreach { row => logDebug(msgFormat(row)) }
      doMoreStuff()
    }
    rdd
  }

  def isDebugMode: Boolean = ???
  def logDebug(s: String) = ???
  def doMoreStuff(): Unit = ???
}

// add implicit conversion from RDD to our new class
object RDDDebugFunction {
  implicit def toDebugFunction[K](rdd: RDD[K]): RDDDebugFunction[K] = new RDDDebugFunction(rdd)
}

现在,通过导入RDDDebugFunction._,我们可以调用我们的新方法:

val rdd = sc.parallelize(Seq(1,2,3,4))

import RDDDebugFunction._

rdd.printDebugRecords(row => "Rows of newRDD: " + row.toString.substring(0, 200))
rdd.count

关于scala - 如何在 Spark 中编写干净的调试语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48158677/

相关文章:

apache-spark - createOrReplaceGlobalTempView 和 createOrReplaceTempView 之间的区别

Scala - 为什么无法覆盖父类(super class)的方法

scala - Scala 2.9中的标准十进制类型是什么?

Scala - 如何解决 "Value is not a member of Nothing"错误

scala - Scala中,Future[Option[A]]如何进行类型转换?

scala - 过滤 kafka 消息时 Spark 作业失败

scala - 在 Build.scala 中指定插件

java - 在使用 Mockito 定义 mock 的行为时测试 RDD 的 equals

apache-spark - 如何在Databricks中显示所有数据库中的所有表

apache-spark - 带有多个 JDBC jar 的 EMR 上的 Spark