[英]Registering complex scala classes with Kryo in spark-shell and Scala jars
[英]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.