Cryo 对 Spark SQL 有帮助吗?

Does Kryo help in SparkSQL?

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

我认为为每个select定义大小写类不是个好主意。
或者如果我像 registerKryoClasses(Array(classOf[Info]))

这样注册 Info 会有帮助吗

您可以通过在您的 SparkConf 上或在传递给 的自定义属性文件中将 spark.serializer 属性 设置为 org.apache.spark.serializer.KryoSerializer 来将序列化程序设置为 kryo spark-submit 命令通过 --properties-file 标志。

当您配置 Kryo 序列化程序时,Spark 将在节点之间传输数据时透明地使用 Kryo。因此,您的 Spark SQL 语句应该自动继承性能优势。

根据 Spark's documentation,SparkSQL 不使用 Kryo 或 Java 序列化。

Datasets are similar to RDDs, however, instead of using Java serialization or Kryo they use a specialized Encoder to serialize the objects for processing or transmitting over the network. While both encoders and standard serialization are responsible for turning an object into bytes, encoders are code generated dynamically and use a format that allows Spark to perform many operations like filtering, sorting and hashing without deserializing the bytes back into an object.

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

也就是说,有一种方法可以将 Kryo 用作编码器实现,请参见此处的示例:。但这意味着作为在数据集中存储自定义对象(例如非产品 classes)的解决方案,而不是特别针对标准数据帧。

没有 Java 序列化器的 Kryo,为自定义非产品 classes 创建编码器有些受限(请参阅关于用户定义类型的讨论),例如,从这里开始: