# Proposal - Proposal: [Decouple logical from physical types](https://github.com/apache/datafusion/issues/11513) - 逻辑类型是一种抽象表示,脱离它的物理实现。 - 物理实现:数据如何存储、访问和检索。 - **现状**:当前单纯依赖 arrow 的 DataType enum,类型和物理实现是一一对应的。 - **问题**:逻辑上相等的类型,在 Arrow 中有多种不同的 DataTypes - string:Utf8,Dictionary(Utf8),RunEndEncoded 等 - **目标**: - 吸纳 DataType 的一个子集作为 logical types - 定义逻辑类型和物理类型在 planning 和 execution path 中的边界 - 引入 logical ScalarValue - 定义如何为物理类型指定具体化选项 ## 定义逻辑类型 - Arrow 有些类型包含了它们的编码信息(如 Large、Dictionary、FixedSize),这类类型应该丢弃编码信息,整合为一个逻辑类型。 - 允许将用户自定义的物理类型映射到已有的逻辑类型 - Arrow 类型扩展:[Extension types](https://arrow.apache.org/docs/format/Columnar.html#extension-types) - 例如用户定义了一个物理类型的扩展 - 基于 List(UInt8) - custom metadata:`{'ARROW:extension:name': 'myorg.mystring'}` 可以将其映射为逻辑类型 `Utf8` - 用户自定义逻辑类型,包含: - 一个描述它逻辑类型的结构 - 类型的 metadata ## 逻辑类型和物理类型的边界 ### 在 plan 和 表达式中 - 逻辑类型只使用于逻辑计划和逻辑表达式(Expr) - 逻辑计划不需要关心底层的编码 - 物理类型也只使用于 `ExecutionPlan` 和 `PhysicalExpr` ### 在函数中 - 函数签名使用逻辑类型,可以简化 coercion rules - 更少的类型 - 更少的规则:例如定义规则为所有可以转换为 Utft8 的类型 - 函数调用执行处理物理类型。