Kryo在SparkSQL中有帮助吗?

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.
或者它帮助,如果我注册InforegisterKryoClasses(Array(classOf[Info]))

GPI*_*GPI 5

根据Spark的文档,SparkSQL不使用Kryo或Java序列化.

数据集与RDD类似,但是,它们不使用Java序列化或Kryo,而是使用专用的编码器来序列化对象以便通过网络进行处理或传输.虽然编码器和标准序列化都负责将对象转换为字节,但编码器是动态生成的代码,并使用一种格式,允许Spark执行许多操作,如过滤,排序和散列,而无需将字节反序列化为对象.

它们比Java或Kryo轻得多,这是预期的(序列化是一个更可优化的工作,比如一行3长和两个整数),而不是类,它的版本描述,它的内部变量. .)并且必须实现它.

缺点是,目前,为自定义非产品类创建编码器有些限制(请参阅有关用户定义类型的讨论),例如,从这里开始:Apache spark 2.2是否支持用户定义类型(UDT)?