半结构化数据类型
概述
当前 DataType
的不足
-
DataType
是一个枚举类型,我们必须在使用特定类型后进行匹配。例如,如果我们想通过DataType
创建反序列化器/序列化器,我们应该始终进行匹配。这并不意味着匹配是不必要的。如果我们想为DataType
添加越来越多的功能,匹配可能会非常繁琐。 -
DataType
表示为枚举类型,我们无法将其用作泛型参数。 -
DataType
可能涉及一些嵌套数据类型,例如DataType::Struct
,但我们把DataField
放在DataType
内部,这在逻辑上是不合理的。 -
难以将属性放入基于枚举的
DataType
中,例如可空属性 #3726 #3769
关于列的概念过多(Series/Column/Array)
DataColumn
是一个枚举,包括Constant(value)
和Array(Series)
pub enum DataColumn {
// 值的数组。
Array(Series),
// 单个值。
Constant(DataValue, usize),
}
Series
是SeriesTrait
的包装
pub struct Series(pub Arc<dyn SeriesTrait>);
概述
半结构化数据类型用于表示无模式的数据格式,如 JSON、XML 等。 为了兼容 Snowflake 的 SQL 语法,我们支持以下三种半结构化数据类型:
Variant
:一种带标签的通用类型,可以存储任何其他类型的值,包括Object
和Array
。Object
:用于表示键值对的集合,其中键是非空字符串,值是Variant
类型的值。Array
:用于表示任意大小的密集或稀疏数组,其中索引是非负整数(最多 2^31-1),值是Variant
类型。
由于 Object
和 Array
可以被视为 Variant
的一种类型,以下介绍主要以 Variant
为例。
示例
以下示例展示了如何创建一个包含 VARIANT
、ARRAY
和 OBJECT
数据类型的表,插入并查询一些测试数据。
CREATE TABLE test_semi_structured (
var variant,
arr array,
obj object
);
INSERT INTO test_semi_structured (var, arr, obj)
SELECT 1, array_construct(1, 2, 3)
, parse_json(' { "key1": "value1", "key2": "value2" } ');
INSERT INTO test_semi_structured (var, arr, obj)
SELECT to_variant('abc')
, array_construct('a', 'b', 'c')
, parse_json(' { "key1": [1, 2, 3], "key2": ["a", "b", "c"] } ');
SELECT * FROM test_semi_structured;
+-------+-------------------+----------------------------------------------------+
| var | arr | obj |
+-------+-------------------+----------------------------------------------------+
| 1 | [ 1, 2, 3 ] | { "key1": "value1", "key2": "value2" } |
| "abc" | [ "a", "b", "c" ] | { "key1": [ 1, 2, 3 ], "key2": [ "a", "b", "c" ] } |
+-------+-------------------+----------------------------------------------------+