繁体   English   中英

如何在 spark-shell 中注册 kryo 类

[英]How to register kryo classes in the spark-shell

SparkConf有方法registerKryoClasses

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

但是,它在SparkSession.conf()属性提供的RuntimeConfiguration外观中不可用/不公开

@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 set(key,value) ,有一个明确的解决方法:我们可以SparkConf提供给

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

然后一个不是很清楚..

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

但是在运行Spark shell时,已经创建了sparkSession / sparkContext 那么非运行时设置如何生效呢?

这里特别需要的是:

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

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

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

错误:值 registerKryoClasses 不是 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]

在范围内隐含这个似乎直接在SparkConf上用kryo注册类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM