如何在Scala Spark中访问用于调试目的的类型签名

如何在Scala Spark中访问用于调试目的的类型签名,scala,apache-spark,Scala,Apache Spark,从spark shell运行spark时,当创建每个已定义变量时,shell将打印该变量的类型签名以及实例的toString 如何通过编程方式生成相同的签名,而不使用shell进行调试,从而从spark脚本或类生成日志或stdout/stderr 在spark shell中运行的示例代码请参见下面的粗体输出 代码: 在spark shell中运行的代码请参见以下输出:我想从api生成该代码: 我希望在日志或输出中生成的示例类型信息: 数组[字符串] org.apache.spark.rdd.rd

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

如何通过编程方式生成相同的签名,而不使用shell进行调试,从而从spark脚本或类生成日志或stdout/stderr

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

代码: 在spark shell中运行的代码请参见以下输出:我想从api生成该代码: 我希望在日志或输出中生成的示例类型信息: 数组[字符串] org.apache.spark.rdd.rdd[String] org.apache.spark.rdd.rdd[String,Int]

您可以使用此getClass.getSimpleName获取日志记录的可读名称,例如:

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

此外,如果使用intelliJ,只需使用command+p检查变量的类型

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


因此,如果您只关心类型,那么您已经介绍了Scala语言以及您的IDE来帮助您进行推理。但是,RDD还提供了toDebugString方法,该方法描述RDD及其依赖关系。这对于调试非常有用,特别是在识别您正在处理的特定类型的RDD时。但是它不会告诉您所包含的类型,因为您已经知道了。

虽然其他答案正确地说这通常是不必要的,但您可以这样做:

import scala.reflect.runtime.universe._
def typeName[A](x: => A)(implicit tag: WeakTypeTag[A]) = tag.toString
By name parameter=>A确保可以安全地调用它,例如在foox、bary上调用,而不实际计算bar或foo,或者在惰性值上调用。有关TypeTags的更多信息,请参阅

val data = Array("one", "two", "three", "two", "three", "three")
print(data.getClass.getSimpleName)     // Output: String[]
import scala.reflect.runtime.universe._
def typeName[A](x: => A)(implicit tag: WeakTypeTag[A]) = tag.toString