SparkConf
有方法registerKryoClasses
:
def registerKryoClasses(classes: Array[Class[_]]): SparkConf = { .. }
但是,它在
RuntimeConfiguration
中不可用/公开门面由 SparkSession.conf()
提供属性@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]))
当试图在
SqlConf
上设置时提供给 spark
session 对象我们得到这个异常: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]))
那么,kryo 序列化程序如何在
spark-shell
中注册? ?
最佳答案
以下不是对 [我自己] 问题的确切答案 - 但它似乎可以作为当前特定困境的解决方法:
implicit val generalRowEncoder: Encoder[Row] = org.apache.spark.sql.Encoders.kryo[Row]
将这个隐含在范围内似乎直接在 SparkConf 上使用 kryo 注册类。
关于scala - 如何在 spark-shell 中注册 kryo 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839755/