编码器和CatalystSerde之间是什么关系

时间:2019-12-19 09:47:05

标签: apache-spark

Encoder用于serialize/deserialize到Spark SQL内部Row的Java对象。所以,我认为这是SerDe框架,

但是,我还看到了另一个名为CatalystSerde的对象。我想问一下Encoder and CatalystSerde之间的关系。以下是CatalystSerde

的定义
object CatalystSerde {
  def deserialize[T : Encoder](child: LogicalPlan): DeserializeToObject = {
    val deserializer = UnresolvedDeserializer(encoderFor[T].deserializer)
    DeserializeToObject(deserializer, generateObjAttr[T], child)
  }

  def serialize[T : Encoder](child: LogicalPlan): SerializeFromObject = {
    SerializeFromObject(encoderFor[T].namedExpressions, child)
  }

  def generateObjAttr[T : Encoder]: Attribute = {
    val enc = encoderFor[T]
    val dataType = enc.deserializer.dataType
    val nullable = !enc.clsTag.runtimeClass.isPrimitive
    AttributeReference("obj", dataType, nullable)()
  }
}

1 个答案:

答案 0 :(得分:1)

Spark使用编码器进行序列化,在此我听说催化优化器不是serde,但它可以优化spark中的序列化。

在考虑编码器和催化剂优化器时,以下几点很重要,

  1. 编码器是Spark SQL中序列化和反序列化(SerDes)框架的主要概念。编码器在JVM对象和Spark的内部二进制格式之间转换。 Spark具有非常先进的内置编码器。它们生成字节码以与堆外数据进行交互。
  2. Catalyst Serde包括针对Spark所需的操作类型进行了调整的专用内存中数据结构,改进的代码生成以及专用的有线协议。 它的表示形式比使用Java甚至Kryo序列化器序列化的对象要小。