数据类型
数据类型
DataFusion 使用 Arrow,因而也使用 Arrow 类型系统来执行查询。来自 sqlparser-rs 的 SQL 类型会按照下表映射为 Arrow 数据类型。这种映射发生在使用 CREATE EXTERNAL TABLE 命令定义架构时,或执行 SQL CAST 操作时。
关于扩展类型和自定义元数据的背景知识,请参阅 Implementing User Defined Types and Custom Metadata in DataFusion 博文。
你可以使用 arrow_typeof 函数查看任意 SQL 表达式所对应的 Arrow 类型。例如:
select arrow_typeof(interval '1 month');
+---------------------------------------------------------------------+
| arrow_typeof(IntervalMonthDayNano("79228162514264337593543950336")) |
+---------------------------------------------------------------------+
| Interval(MonthDayNano) |
+---------------------------------------------------------------------+你可以使用 arrow_cast 函数将 SQL 表达式转换为指定的 Arrow 类型。例如,要将 now() 的输出转换为秒精度的 Timestamp:
select arrow_cast(now(), 'Timestamp(s)') as "now()";
+---------------------+
| now() |
+---------------------+
| 2025-10-24T20:02:45 |
+---------------------+旧版语法依然有效:
select arrow_cast(now(), 'Timestamp(Second, None)') as "now()";
+---------------------+
| now() |
+---------------------+
| 2023-03-03T17:19:21 |
+---------------------+字符类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
CHAR | Utf8View |
VARCHAR | Utf8View |
TEXT | Utf8View |
STRING | Utf8View |
CHARACTER VARYING | Utf8View |
CHAR VARYING | Utf8View |
NVARCHAR | Utf8View |
默认情况下,字符串类型会映射为 Utf8View。可以通过 datafusion.sql_parser.map_string_types_to_utf8view 设置项进行配置。当该设置为 false 时,字符串类型将改为映射为 Utf8。
请注意,CHAR、VARCHAR、STRING、CHARACTER VARYING、CHAR VARYING 和 NVARCHAR 可以选择性地指定最大长度(例如 VARCHAR(n))。不过,该限制会被忽略。若希望在传入长度时抛出错误,请将 datafusion.sql_parser.support_varchar_with_length 设置为 false。
数值类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
TINYINT | Int8 |
SMALLINT 或 INT2 | Int16 |
INT 或 INTEGER 或 INT4 | Int32 |
BIGINT 或 INT8 | Int64 |
TINYINT UNSIGNED 或 UTINYINT | UInt8 |
SMALLINT UNSIGNED 或 INT2 UNSIGNED 或 USMALLINT | UInt16 |
INT UNSIGNED 或 INTEGER UNSIGNED 或 INT4 UNSIGNED | UInt32 |
BIGINT UNSIGNED 或 INT8 UNSIGNED 或 UBIGINT | UInt64 |
FLOAT 或 FLOAT4 或 REAL | Float32 |
DOUBLE 或 DOUBLE PRECISION 或 FLOAT8 | Float64 |
DECIMAL(precision, scale) 或 NUMERIC(precision, scale),其中 precision ≤ 38 | Decimal128(precision, scale) |
DECIMAL(precision, scale) 或 NUMERIC(precision, scale),其中 precision > 38 | Decimal256(precision, scale) |
DECIMAL 类型支持的最大精度为 76。
日期/时间类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
DATE | Date32 |
TIME | Time64(Nanosecond) |
TIMESTAMP | Timestamp(Nanosecond, None) |
INTERVAL | Interval(IntervalMonthDayNano) |
布尔类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
BOOLEAN 或 BOOL | Boolean |
二进制类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
BYTEA | Binary |
BLOB | Binary |
BINARY | Binary |
VARBINARY | Binary |
BYTES | Binary |
你可以使用十六进制字符串字面量(例如 X'1234')创建二进制字面量,它会生成一个包含两个字节 0x12 和 0x34 的 Binary 值。
嵌套类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
ARRAY<T> 或 T[] | List(T) |
T[n] | FixedSizeList(n x T) |
MAP(k, v) | Map(k, v) |
STRUCT<[c0] T0[, ..., [cn] Tn]> | Struct(c0: T0[, ..., cn: Tn]) |
使用 STRUCT 定义的列要求所有行具有相同的 schema,而 MAP 则没有这样的限制。
还要注意,STRUCT 可以在不定义字段名的情况下声明。在这种情况下,字段名将被设置为 c0、c1、…、cn。
不支持的 SQL 类型
| SQL 数据类型 | Arrow 数据类型 |
|---|---|
UUID | 尚不支持 |
CLOB | 尚不支持 |
REGCLASS | 尚不支持 |
CUSTOM | 尚不支持 |
ENUM | 尚不支持 |
SET | 尚不支持 |
DATETIME | 尚不支持 |
评论
登录后参与评论
KnowForge