use*_*167 4 apache-spark apache-spark-sql
Kryo通过高效的序列化方法帮助提高Spark应用程序的性能.
我想知道,如果Kryo会在SparkSQL的情况下提供帮助,我应该如何使用它.
在SparkSQL应用程序中,我们会做很多基于列的操作df.select($"c1", $"c2"),并且DataFrame Row的模式不是很静态.
不确定如何为用例注册一个或多个序列化程序类.
例如:
case class Info(name: String, address: String)
...
val df = spark.sparkContext.textFile(args(0))
.map(_.split(','))
.filter(_.length >= 2)
.map {e => Info(e(0), e(1))}
.toDF
df.select($"name") ... // followed by subsequent analysis
df.select($"address") ... // followed by subsequent analysis
Run Code Online (Sandbox Code Playgroud)
我认为为每个案例定义案例类并不是一个好主意select.
或者它帮助,如果我注册Info像registerKryoClasses(Array(classOf[Info]))
根据Spark的文档,SparkSQL不使用Kryo或Java序列化.
数据集与RDD类似,但是,它们不使用Java序列化或Kryo,而是使用专用的编码器来序列化对象以便通过网络进行处理或传输.虽然编码器和标准序列化都负责将对象转换为字节,但编码器是动态生成的代码,并使用一种格式,允许Spark执行许多操作,如过滤,排序和散列,而无需将字节反序列化为对象.
它们比Java或Kryo轻得多,这是预期的(序列化是一个更可优化的工作,比如一行3长和两个整数),而不是类,它的版本描述,它的内部变量. .)并且必须实现它.
缺点是,目前,为自定义非产品类创建编码器有些限制(请参阅有关用户定义类型的讨论),例如,从这里开始:Apache spark 2.2是否支持用户定义类型(UDT)?