【问题标题】:How to Accessing Type Signature for debuging purposes in Scala Spark如何在 Scala Spark 中访问类型签名以进行调试
【发布时间】:2017-04-24 15:03:06
【问题描述】:

从 spark-shell 运行 spark 时,当创建每个定义的变量时,shell 会打印出该变量的类型签名以及实例的 toString。

如何在不使用 shell(用于调试日志或 stdout/stderr)的情况下从 spark 脚本或类以编程方式生成相同的签名?

在 spark shell 中运行的示例代码(见下面的粗体输出)


代码:

val data = Array("one", "two", "three", "two", "three", "three")
val dataRdd = sc.parallelize(data)
val dataTupleRdd =  dataRdd.map(word => (word, 1))
val countsRdd = dataTupleRdd.reduceByKey(_ + _)
countsRdd.foreach(println)

代码在 spark shell 中运行(见下面的输出:我想从 api 生成): 我想要生成的示例类型信息(在日志或输出中):
Array[String]
org.apache.spark.rdd.RDD[String]
org.apache.spark.rdd.RDD[(String, Int)]


Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.0
      /_/

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45)
Type in expressions to have them evaluated.
Type :help for more information.

scala> val data = Array("one", "two", "three", "two", "three", "three")
data: Array[String] = Array(one, two, three, two, three, three)

scala> val dataRdd = sc.parallelize(data)
dataRdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:26

scala> val dataTupleRdd =  dataRdd.map(word => (word, 1))
dataTupleRdd: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[1] at map at <console>:28

scala> val countsRdd = dataTupleRdd.reduceByKey(_ + _)
countsRdd: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[2] at reduceByKey at <console>:30

scala> countsRdd.foreach(println)
(two,2)
(one,1)
(three,3)

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    我很难理解您的问题,因为这意味着您需要等到运行时才能看到您拥有什么。在像 Scala 这样的静态类型语言中,情况并非如此。您可以自己显式键入您的值(必要时使用您的 IDE)并在编译时准确查看您拥有的值。

    因此,如果您只关心类型,那么 Scala 语言(以及帮助您推理事物的 IDE)可以满足您的需求。但是,RDDs 也提供了toDebugString 方法,它描述了RDDs 及其依赖关系。这对于调试非常有用——特别是在识别您正在处理的RDD 的特定类型时。但它不会告诉你包含的类型,因为你已经知道了。

    【讨论】:

      【解决方案2】:

      您可以使用这个getClass.getSimpleName 来获取日志的可读名称,例如:

      val data = Array("one", "two", "three", "two", "three", "three")
      print(data.getClass.getSimpleName)     // Output: String[]
      

      另外,如果您使用的是 intelliJ,您可以简单地使用 command + P 来检查变量的类型。

      【讨论】:

        【解决方案3】:

        虽然其他答案说这通常不需要,但您可以这样做:

        import scala.reflect.runtime.universe._
        def typeName[A](x: => A)(implicit tag: WeakTypeTag[A]) = tag.toString
        

        按名称参数 (=&gt; A) 确保可以安全地调用它,例如在 foo(x, bar(y)) 上而不实际评估 barfoo,或在惰性值上。有关TypeTags 的更多信息,请参阅http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html

        【讨论】:

          猜你喜欢
          • 2012-01-04
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2018-07-03
          • 2021-08-17
          • 1970-01-01
          • 2019-11-13
          • 2015-09-12
          相关资源
          最近更新 更多