在Spark中使用数据集时,我们需要指定用于序列化和反序列化对象的编码器。我们可以选择使用Encoders.bean(Class<T>)
或Encoders.kryo(Class<T>)
。
这些不同,使用一个与另一个相比有什么性能影响?
答案 0 :(得分:1)
出于多种原因,始终建议将Kryo序列化用于Java序列化。其中一些在下面。
Cache()
和Persist()
的情况下。这在Shuffling
。saveAsObjectFile
和objectFile
上的SparkContext
方法仅支持java序列化。sparkConf.registerKryoClasses(Array( classOf[A], classOf[B], ...))
或sparkConf.set("spark.kryo.registrator", "MyKryoRegistrator")
来避免这种情况。这节省了大量空间并避免了不必要的元数据。 bean()
和javaSerialization()
之间的区别是javaSerialization使用通用java序列化序列化T
类型的对象。此编码器将T
映射到单字节数组(二进制)字段。 bean在哪里创建类型为T
的Java Bean的编码器。它们都使用Java Serialization,唯一的区别是它们如何将对象表示为字节。
从文档中引用
JavaSerialization效率极低,只能用作 不得已。