我们在 Spark 3.1 中使用
RowEncoder.apply(schema).resolveAndBind()
来创建 ExpressionEncoder[row]
并从中创建序列化器和反序列化器。
val encoder = Encoders.row(schema).resolveAndBind()
val serializer = encoder.createSerializer()
val deserializer = encoder.createDeserializer()
我们必须升级到 Spark 3.5,而
RowEncoder.apply()
在 Spark 3.5 中不可用。我知道我们可以使用 Encoders.row(schema)
来替换 RowEncoder.apply(schema),但是如何为 Row 到 internalRow
以及相反的转换创建序列化器和反序列化器?
我尝试了解如何使用
Encoder[Row]
但仍然不明白如何创建序列化器/反序列化器
// currently in 3.5/4 prev it's an ExpressionEncoder
val renc = Encoders.row(structType).asInstanceOf[ExpressionEncoder]
val encoder = renc.resolveAndBind()
val serializer = encoder.createSerializer()
val deserializer = encoder.createDeserializer()
应该没问题(请参阅此处了解 .row 是 ExpressionEncoder)。 看看你对此有什么用例会很有趣,它是非常内部的,直接调用resolveAndBind可能会导致问题(对于表达式,你最好将编码器作为要解析的参数),可能有更好的方法.