如何在 spark-shell 中注册 kryo 类

How to register kryo classes in the spark-shell

SparkConf 有方法 registerKryoClasses:

def registerKryoClasses(classes: Array[Class[_]]): SparkConf = { .. }

但是 SparkSession.conf() 属性

提供的 RuntimeConfiguration 门面中没有 available/exposed
@transient lazy val conf: RuntimeConfig = new RuntimeConfig(sessionState.conf)

这里是关于 RuntimeConfiguration 的更多信息:

/**
 * Runtime configuration interface for Spark. To access this, use `SparkSession.conf`.
 *
 * Options set here are automatically propagated to the Hadoop configuration during I/O.
 *
 * @since 2.0.0
 */
@InterfaceStability.Stable
class RuntimeConfig private[sql](sqlConf: SQLConf = new SQLConf) {

创建我们自己的 SparkSession 时有一个明确的解决方法:我们可以在提供给

SparkConf 上调用 set(key,value)
val mysparkConf = SparkConf.set(someKey,someVal)
mysparkConf.registerKryoClasses(Array(classOf[Array[InternalRow]]))
SparkSession.builder.conf(mySparkConf)

还有一个那么清楚..

conf.registerKryoClasses(Array(classOf[scala.reflect.ClassTag$$anon]))

但是当 运行 Spark shellsparkSession/sparkContext 已经创建。那么非运行时设置如何生效呢?

这里特别需要的是:

sparkConf.registerKryoClasses(Array(classOf[org.apache.spark.sql.Row]))

当试图在 spark 会话对象可用的 SqlConf 上设置时,我们得到这个异常:

scala>   spark.conf.registerKryoClasses(Array(classOf[Row]))

error: value registerKryoClasses is not a member of org.apache.spark.sql.RuntimeConfig spark.conf.registerKryoClasses(Array(classOf[Row]))

那么如何在 spark-shell 中注册 kryo 序列化程序?

以下不是[我自己的]问题的确切答案 - 但它似乎可以作为当前特定困境的解决方法:

implicit val generalRowEncoder: Encoder[Row] = org.apache.spark.sql.Encoders.kryo[Row]

在范围内有这个 implicit 似乎直接在 SparkConf 上用 kryo 注册 类 .