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
, мы получаем следующее исключение:
scala> spark.conf.registerKryoClasses(Array(classOf[Row]))
ошибка: значение registerKryoClasses не является членом org.apache.spark.sql.RuntimeConfig
spark.conf.registerKryoClasses (Array (classOf [строка]))
Так как же тогда сериализаторы крио регистрироваться в spark-shell
?