Spark 2.2强制Kryo注册时InternalRow[]未注册问题求助
解决Spark 2.2中Kryo强制注册时
org.apache.spark.sql.catalyst.InternalRow[]未注册的问题 这个问题我之前也碰到过,核心原因是你漏掉了数组类型的Kryo注册,而且对Scala中获取数组类的方式有点误解,我来一步步帮你解决:
问题根源
报错里的org.apache.spark.sql.catalyst.InternalRow[]其实是InternalRow的数组类型——Kryo会把数组类型和单个元素类型视为完全独立的类型,哪怕你已经注册了InternalRow本身,数组类型还是需要单独显式注册。
你提到Scala里无法编译InternalRow[],这是正常的:InternalRow[]是Java的数组写法,Scala中对应的数组类引用是classOf[Array[org.apache.spark.sql.catalyst.InternalRow]],这才是你需要添加到注册列表里的类型。
解决方法
修改你的Kryo注册代码,把InternalRow的数组类型加入注册数组即可:
.registerKryoClasses(Array( classOf[scala.collection.mutable.WrappedArray.ofRef[_]], classOf[org.apache.spark.sql.catalyst.InternalRow], classOf[Array[org.apache.spark.sql.catalyst.InternalRow]] // 新增数组类型注册 ))
额外提示
如果后续遇到其他类似的数组类型未注册错误(比如XXX[]格式的报错),都可以用同样的逻辑处理:在Scala中通过classOf[Array[XXX]]获取对应的数组类,然后将其加入Kryo的注册列表。
内容的提问来源于stack exchange,提问作者Georg Heiler
相关产品推荐
相关产品推荐

