apache-spark - Cryo 对 Spark SQL 有帮助吗?

标签 apache-spark apache-spark-sql kryo

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 定义案例类不是一个好主意.
或者如果我注册 Info 有帮助吗?喜欢 registerKryoClasses(Array(classOf[Info]))

最佳答案

根据 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 个 long 和两个 int 的行),而不是一个类、它的版本描述、它的内部变量。 .) 并且必须实例化它。

话虽如此,有一种方法可以将 Kryo 用作编码器实现,请参见此处的示例:How to store custom objects in Dataset? .但这意味着在数据集中存储自定义对象(例如非产品类)的解决方案,而不是专门针对标准数据帧。

如果没有 Java 序列化程序的 Kryo,为自定义的非产品类创建编码器会有些受限(请参阅有关用户定义类型的讨论),例如,从这里开始:Does Apache spark 2.2 supports user-defined type (UDT)?

关于apache-spark - Cryo 对 Spark SQL 有帮助吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49270880/

相关文章:

Scala Spark RDD、数据集、RDD 对和分区

apache-spark - 如何将 Spark Streaming 与 Kafka 与 Kerberos 一起使用?

python - 如何根据 Pyspark 中数组列中的值创建新列

python - col 函数如何知道我们引用的是哪个 DataFrame?

java - Kryo 字节级追加

java - 将 Spark 的 Kryo 序列化程序与具有字符串数组的 Java Protocol Buffer 一起使用时出错

apache-spark - 如何确保从 Parquet 加载 Spark DataFrame 是分布式和并行的?

apache-spark - 如何在 Spark 中实现 "Cross Join"?

apache-spark - Spark是否支持对S3中的 Parquet 文件进行真实的列扫描?

scala - 如何在spark中使用kryo序列化器注册StringType$