使用数据集API时仍然需要Kryo序列化吗?
因为数据集使用Encoders进行序列化和反序列化:
答案 0 :(得分:0)
如果范围内有可以序列化数据集类型(例如ExpressionEncoder或RowEncoder)的Encoder,则无需为数据集使用Kryo。它们可以进行字段级序列化,因此您可以在不解包整个对象的情况下对数据集中的列进行过滤等操作。编码器还有其他优化功能,例如“运行时代码生成以构建用于序列化和反序列化的自定义字节码”,并且比Kryo快许多倍。
但是,如果您尝试将类型放入数据集中而Spark找不到相应的编码器,则在编译时或运行时都会收到错误消息(如果非序列化类型嵌套在case类或东西)。例如,假设您要使用fastutil库中的DoubleRBTreeSet。在这种情况下,您需要为其定义一个编码器,而快速解决方案通常是使用Kryo:
implicit val rbTreeEncoder = Encoders.kryo[DoubleRBTreeSet]