使用Dataset API时是否仍需要Kryo序列化?
因为数据集使用Encoders进行序列化和反序列化:
如果范围内的编码器可以序列化数据集的类型(如ExpressionEncoder或RowEncoder),则不需要将Kryo用于数据集。这些可以进行字段级序列化,因此您可以执行诸如过滤数据集中的列而不解压缩整个对象的操作。编码器还有其他优化,例如“运行时代码生成,用于构建用于序列化和反序列化的自定义字节码”,并且可以比Kryo快许多倍。
但是,如果您尝试在数据集中放置一个类型并且Spark无法为其找到编码器,则会在编译时或运行时收到错误(如果不可序列化的类型嵌套在案例类或其他内容中)。例如,假设您想使用fastutil库中的DoubleRBTreeSet。在那种情况下,你需要为它定义一个编码器,快速修复通常是使用Kryo:
implicit val rbTreeEncoder = Encoders.kryo[DoubleRBTreeSet]