Registring Kryo课程不起作用

时间:2016-10-29 13:32:21

标签: scala apache-spark kryo

我有以下代码:

val conf = new SparkConf().setAppName("MyApp")
val sc = new SparkContext(conf)
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
new conf.registerKryoClasses(new Class<?>[]{
        Class.forName("org.apache.hadoop.io.LongWritable"),
        Class.forName("org.apache.hadoop.io.Text")
    });

但是我遇到了以下错误:

')' expected but '[' found.
[error]                 new conf.registerKryoClasses(new Class<?>[]{

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

你正在混合使用Scala和Java。在Scala中,您可以定义Array[Class[_]](而不是Class<?>[]):

val conf = new SparkConf()
            .setAppName("MyApp")
            .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            .registerKryoClasses(Array[Class[_]](
              Class.forName("org.apache.hadoop.io.LongWritable"),
              Class.forName("org.apache.hadoop.io.Text")
            ));

val sc = new SparkContext(conf)

我们甚至可以做得更好。为了不使用字符串文字使我们的类错误,我们实际上可以使用这些类并使用classOf来获取它们的类类型:

import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text

val conf = new SparkConf()
            .setAppName("MyApp")
            .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            .registerKryoClasses(Array[Class[_]](
              classOf[LongWritable],
              classOf[Test],
            ))

val sc = new SparkContext(conf)