暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

最全clickhouse数据类型

骚明的大数据之旅 2021-10-28
1881

0、常用的数据类型

DateTime
Enum
LowCardinality
UInt64
String
Int32
Array

Nested ---> CollapsingMergeTree

1、介绍

ClickHouse 可以在表格单元格中存储各种数据。

本节介绍支持的数据类型以及使用和/或实现它们(如果有)的特殊注意事项。

您可以在system.data_type_families表中检查数据类型名称是否区分大小写。

select * from system.data_type_families;

1.1 数据类型显示

┌─name────────────────────────────┬─case_insensitive─┬─alias_to────┐
│ Polygon │ 0 │ │
│ Ring │ 0 │ │
│ Point │ 0 │ │
│ MultiPolygon │ 0 │ │
│ IPv6 │ 0 │ │
│ IntervalSecond │ 0 │ │
│ IPv4 │ 0 │ │
│ UInt32 │ 0 │ │
│ IntervalYear │ 0 │ │
│ IntervalQuarter │ 0 │ │
│ IntervalMonth │ 0 │ │
│ Int64 │ 0 │ │
│ IntervalDay │ 0 │ │
│ IntervalHour │ 0 │ │
│ UInt256 │ 0 │ │
│ Int16 │ 0 │ │
│ LowCardinality │ 0 │ │
│ AggregateFunction │ 0 │ │
│ Nothing │ 0 │ │
│ Decimal256 │ 1 │ │
│ Tuple │ 0 │ │
│ Array │ 0 │ │
│ Enum16 │ 0 │ │
│ IntervalMinute │ 0 │ │
│ FixedString │ 0 │ │
│ String │ 0 │ │
│ DateTime │ 1 │ │
│ Map │ 0 │ │
│ UUID │ 0 │ │
│ Decimal64 │ 1 │ │
│ Nullable │ 0 │ │
│ Enum │ 0 │ │
│ Int32 │ 0 │ │
│ UInt8 │ 0 │ │
│ Date │ 1 │ │
│ Decimal32 │ 1 │ │
│ UInt128 │ 0 │ │
│ Float64 │ 0 │ │
│ SimpleAggregateFunction │ 0 │ │
│ Nested │ 0 │ │
│ DateTime64 │ 1 │ │
│ Int128 │ 0 │ │
│ Decimal128 │ 1 │ │
│ Int8 │ 0 │ │
│ Decimal │ 1 │ │
│ Int256 │ 0 │ │
│ IntervalWeek │ 0 │ │
│ UInt64 │ 0 │ │
│ Enum8 │ 0 │ │
│ DateTime32 │ 1 │ │
│ UInt16 │ 0 │ │
│ Float32 │ 0 │ │
│ INET6 │ 1 │ IPv6 │
│ INET4 │ 1 │ IPv4 │
│ BINARY │ 1 │ FixedString │
│ NATIONAL CHAR VARYING │ 1 │ String │
│ BINARY VARYING │ 1 │ String │
│ NCHAR LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER VARYING │ 1 │ String │
│ NATIONAL CHARACTER LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER │ 1 │ String │
│ NATIONAL CHAR │ 1 │ String │
│ CHARACTER VARYING │ 1 │ String │
│ LONGBLOB │ 1 │ String │
│ MEDIUMTEXT │ 1 │ String │
│ TEXT │ 1 │ String │
│ TINYBLOB │ 1 │ String │
│ VARCHAR2 │ 1 │ String │
│ CHARACTER LARGE OBJECT │ 1 │ String │
│ DOUBLE PRECISION │ 1 │ Float64 │
│ LONGTEXT │ 1 │ String │
│ NVARCHAR │ 1 │ String │
│ INT1 UNSIGNED │ 1 │ UInt8 │
│ VARCHAR │ 1 │ String │
│ CHAR VARYING │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ NCHAR │ 1 │ String │
│ CHAR │ 1 │ String │
│ SMALLINT UNSIGNED │ 1 │ UInt16 │
│ TIMESTAMP │ 1 │ DateTime │
│ FIXED │ 1 │ Decimal │
│ TINYTEXT │ 1 │ String │
│ NUMERIC │ 1 │ Decimal │
│ DEC │ 1 │ Decimal │
│ TINYINT UNSIGNED │ 1 │ UInt8 │
│ INTEGER UNSIGNED │ 1 │ UInt32 │
│ INT UNSIGNED │ 1 │ UInt32 │
│ CLOB │ 1 │ String │
│ MEDIUMINT UNSIGNED │ 1 │ UInt32 │
│ BOOL │ 1 │ Int8 │
│ SMALLINT │ 1 │ Int16 │
│ INTEGER SIGNED │ 1 │ Int32 │
│ NCHAR VARYING │ 1 │ String │
│ INT SIGNED │ 1 │ Int32 │
│ TINYINT SIGNED │ 1 │ Int8 │
│ BIGINT SIGNED │ 1 │ Int64 │
│ BINARY LARGE OBJECT │ 1 │ String │
│ SMALLINT SIGNED │ 1 │ Int16 │
│ MEDIUMINT │ 1 │ Int32 │
│ INTEGER │ 1 │ Int32 │
│ INT1 SIGNED │ 1 │ Int8 │
│ BIGINT UNSIGNED │ 1 │ UInt64 │
│ BYTEA │ 1 │ String │
│ INT │ 1 │ Int32 │
│ SINGLE │ 1 │ Float32 │
│ FLOAT │ 1 │ Float32 │
│ MEDIUMINT SIGNED │ 1 │ Int32 │
│ BOOLEAN │ 1 │ Int8 │
│ DOUBLE │ 1 │ Float64 │
│ INT1 │ 1 │ Int8 │
│ CHAR LARGE OBJECT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ BIGINT │ 1 │ Int64 │
│ CHARACTER │ 1 │ String │
│ BYTE │ 1 │ Int8 │
│ BLOB │ 1 │ String │
│ REAL │ 1 │ Float32 │
└─────────────────────────────────┴──────────────────┴─────────────┘

2、整数类型

定长整数,带或不带符号。

创建表格时,可以设置整数的数字参数(例如TINYINT(8)SMALLINT(16)INT(32)BIGINT(64)),但 ClickHouse 会忽略它们。

2.1 整数范围

Int8 — [-128 : 127]
Int16 — [-32768 : 32767]
Int32 — [-2147483648 : 2147483647]
Int64 — [-9223372036854775808 : 9223372036854775807]
Int128 — [-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]
Int256 - [-57896044618658097711785492504343953926634992332820282019728792003956564819968:57896044618658097711785492504343953926634992332820282019728792003956564819967]

2.2 别名

Int8— TINYINT、BOOL、BOOLEAN、INT1。
Int16- ,。SMALLINTINT2
Int32— INT、INT4、INTEGER。
Int64— BIGINT。

2.3 UInt 范围

UInt8 — [0 : 255]
UInt16 — [0 : 65535]
UInt32 — [0:4294967295]
UInt64 — [0:18446744073709551615]
UInt128 — [0 : 340282366920938463463374607431768211455]
UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]

3、浮点数

我们建议您尽可能以整数形式存储数据。例如,将固定精度数字转换为整数值,例如货币金额或以毫秒为单位的页面加载时间。

  • Float32FLOAT

  • Float64DOUBLE

  • 计算结果取决于计算方法(计算机系统的处理器类型和架构)。

  • 浮点计算可能会产生无穷大 ( Inf) 和“非数字” ( NaN) 等数字。在处理计算结果时应考虑到这一点。

  • 从文本中解析浮点数时,结果可能不是最接近的机器可表示数。

4、Decimal(十进制)

这个要注意的就是,是否会发生溢出行为,以及设置禁用检查

SET decimal_check_overflow = 0;

溢出检查不仅发生在算术运算上,还发生在值比较上:

5、Boolean

这个是没有单独的类型的,可以设置Int8类型的0或者是1

6、String

String 类型替换了其他 DBMS 中的 VARCHAR、BLOB、CLOB 和其他类型。clickhouse不会注意长度等问题,如果您需要存储文本,我们建议使用 UTF-8 编码。至少,如果您的终端使用 UTF-8(按照推荐),您可以读取和写入您的值而无需进行转换。length函数以字节为单位计算字符串长度,而lengthUTF8函数则以Unicode 代码点计算字符串长度。

7、Fixedstring(固定长度)

这个要注意的就是填充问题,带来的空白字符,所以要在查询的时候使用

SELECT *
FROM FixedStringTable
WHERE a = 'b\0';

8、UUID(用户名)

如何使用,clickhouse提供了生成了generateUUIDv4()函数

示例 1

此示例演示如何使用 UUID 类型列创建表并将值插入表中。

CREATE TABLE t_uuid
(
`x` UUID,
`y` String
)
ENGINE = TinyLog;
INSERT INTO t_uuid SELECT
generateUUIDv4(),
'Example 1';
SELECT * FROM t_uuid;

示例 2

在此示例中,插入新记录时未指定 UUID 列值。

INSERT INTO t_uuid (y) VALUES ('Example 2');

UUID 数据类型仅支持String数据类型也支持的函数(例如min、max和count)。

算术运算(例如abs)或聚合函数(例如sum和avg)不支持 UUID 数据类型。

9、日期

9.1 Date

1970-01-01自带的天数,不带时区,但最终完全支持的年份是 2148 年

创建一个带有Date-type 列的表并将数据插入其中:

CREATE TABLE dt
(
`timestamp` Date,
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt VALUES (1546300800, 1), ('2019-01-01', 2);
SELECT * FROM dt;

记住,这个时间的话只能是秒数,也就是10位数的,否则的话会出现结果不一致的情况,而且这个还多了8个小时的时区。只要是同一天的时间在秒数之内的话是没有问题的。

也可以看看

  • 处理日期和时间的函数

  • 用于处理日期和时间的运算符

  • DateTime数据类型

9.2 Date32

支持与Datetime64相同的日期范围。存储在四个字节中,作为自 1925-01-01 以来的天数。允许将值存储到 2283-11-11。

创建一个带有Date32-type 列的表并将数据插入其中:

CREATE TABLE new
(
`timestamp` Date32,
`event_id` UInt8
)
ENGINE = TinyLog;

目前,还不支持Date32的数据类型

INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2);
SELECT * FROM new;

9.3 DateTime

允许存储瞬间,可以表示为日历日期和一天中的时间。

DateTime([timezone])

支持的值范围:[1970-01-01 00:00:00, 2105-12-31 23:59:59]。分辨率:1秒。

查看时区

SELECT * FROM system.time_zones;

clickhouse客户端默认应用服务器时区,如果初始化数据类型时,一个时区未明确设置。要使用客户端时区,请clickhouse-client使用--use_client_time_zone参数运行。

ClickHouse 根据date_time_output_format设置的值输出值。YYYY-MM-DD hh:mm:ss默认文本格式。另外,您可以使用formatDateTime函数更改输出。

1.创建一个带有DateTime-type列的表并插入数据:

CREATE TABLE dt
(
`timestamp` DateTime('Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt Values (1546300800, 1), ('2019-01-01 00:00:00', 2);
  • 将日期时间作为整数插入时,它被视为 Unix 时间戳 (UTC)。1546300800代表'2019-01-01 00:00:00'UTC。但是,由于timestampEurope/Moscow指定了 (UTC+3) 时区,当输出为字符串时,该值将显示为'2019-01-01 03:00:00'

2.过滤DateTime

SELECT * FROM dt WHERE timestamp = toDateTime('2019-01-01 00:00:00', 'Europe/Moscow');
SELECT * FROM dt WHERE timestamp = '2019-01-01 00:00:00'

3.获取DateTime-type 列的时区:

SELECT toDateTime(now(), 'Europe/Moscow') AS column, toTypeName(column) AS x;

4.时区转换

SELECT
toDateTime(timestamp, 'Europe/London') as lon_time,
toDateTime(timestamp, 'Europe/Moscow') as mos_time
FROM dt;

由于时区转换仅更改元数据,因此该操作没有计算成本。

  • 类型转换函数

  • 处理日期和时间的函数

  • 处理数组的函数

  • 该date_time_input_format设置

  • 该date_time_output_format设置

  • 该timezone服务器配置参数

  • 用于处理日期和时间的运算符

  • 该Date数据类型

9.4 DateTime64

允许存储一个瞬间,可以表示为日历日期和一天中的时间,具有定义的亚秒级精度

刻度大小(精度):10 -精度秒。有效范围:[ 0 : 9 ]。
通常使用 - 3(毫秒)、6(微秒)、9(纳秒)。

DateTime64(precision, [timezone])

支持的范围从 1925 年 1 月 1 日到 2283 年 11 月 11 日。

  1. 创建一个带有DateTime64-type 列的表并将数据插入其中:

CREATE TABLE dt
(
`timestamp` DateTime64(3, 'Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2);

与 不同DateTimeDateTime64值不会String自动转换。

  1. 获取DateTime64-type 值的时区:

SELECT toDateTime64(now(), 3, 'Europe/Moscow') AS column, toTypeName(column) AS x;
SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Shanghai');
  • 类型转换函数

  • 处理日期和时间的函数

  • 处理数组的函数

  • 该date_time_input_format设置

  • 该date_time_output_format设置

  • 该timezone服务器配置参数

  • 用于处理日期和时间的运算符

  • Date数据类型

  • DateTime数据类型

10、Enum

命名值必须'string' = integer成对声明。ClickHouse 仅存储数字,但支持通过名称对值进行操作。

ClickHouse 会自动选择Enum插入数据时的类型。您还可以使用Enum8Enum16类型来确定存储的大小。

这里我们创建一个带有Enum8('hello' = 1, 'world' = 2)类型列的表:

CREATE TABLE t_enum
(
x Enum('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog;

Columnx只能存储类型定义中列出的值:'hello''world'。如果您尝试保存任何其他值,ClickHouse 将引发异常。8 位大小Enum是自动选择的。

如果您需要查看行的等效数字,则必须将Enum值转换为整数类型。

SELECT CAST(x, 'Int8') FROM t_enum;

要在查询中创建 Enum 值,您还需要使用CAST.

SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))

AnEnum可以包含在Nullable类型中。因此,如果您使用查询创建表

CREATE TABLE t_enum_nullable
(
x Nullable( Enum8('hello' = 1, 'world' = 2) )
)
ENGINE = TinyLog;
INSERT INTO t_enum_nullable Values('hello'),('world'),(NULL);

11、LowCardinality(低基数)

LowCardinality(data_type)
  • data_typeStringFixedStringDateDateTime和除Decimal之外的数字。LowCardinality对于某些数据类型效率不高,请参阅allow_suspicious_low_cardinality_types设置说明。

使用LowCardinality数据类型的效率取决于数据的多样性。如果字典包含的不同值少于 10,000 个,则 ClickHouse 大多显示出更高的数据读取和存储效率。如果字典包含超过 100,000 个不同的值,则与使用普通数据类型相比,ClickHouse 的性能可能更差。

处理字符串时,请考虑使用LowCardinality而不是EnumLowCardinality在使用中提供了更大的灵活性,并且通常表现出相同或更高的效率。

创建一个带有LowCardinality-column的表:

CREATE TABLE lc_t
(
`id` UInt16,
`strings` LowCardinality(String)
)
ENGINE = MergeTree()
ORDER BY id;

相关设置和功能

设置:

  • low_cardinality_max_dictionary_size

  • low_cardinality_use_single_dictionary_for_part

  • low_cardinality_allow_in_native_format

  • allow_suspicious_low_cardinality_types

  • output_format_arrow_low_cardinality_as_dictionary

职能:

  • 低基数

12、Array

T类型项目的数组。T可以是任何数据类型,包括数组。

您可以使用函数来创建数组:

array(T)

创建数组的示例:

SELECT array(1, 2) AS x, toTypeName(x);
 SELECT [1, 2] AS x, toTypeName(x);

在动态创建数组时,ClickHouse 会自动将参数类型定义为可以存储所有列出的参数的最窄数据类型。如果有任何Nullable或文字NULL值,数组元素的类型也变为Nullable

SELECT array(1, 2, NULL) AS x, toTypeName(x);

所以这个在建表得时候一定要考虑字段是否是为null得情况。。。


可以通过使用size0子列而不读取整列来找到数组的大小。对于多维数组,您可以使用sizeN-1,哪里N是想要的维度。

CREATE TABLE t_arr
(
`arr` Array(Array(Array(UInt32)))
)
ENGINE = MergeTree
ORDER BY tuple();
INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]);

13、AggregateFunction

聚合函数可以有一个实现定义的中间状态,可以序列化为AggregateFunction(…)数据类型并存储在表中,通常是通过物化视图。生成聚合函数状态的常用方法是调用带有-State后缀的聚合函数。以后要得到聚合的最终结果,必须使用相同的带-Merge后缀的聚合函数。

AggregateFunction(name, types_of_arguments…) — 参数数据类型。

  • 聚合函数的名称、

  • 聚合函数参数的类型

CREATE TABLE t
(
column1 AggregateFunction(uniq, UInt64),
column2 AggregateFunction(anyIf, String, UInt8),
column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...

uniq、 anyIf ( any + If ) 和分位数是 ClickHouse 支持的聚合函数。

请参阅AggregatingMergeTree引擎说明。

14、Nested

CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
SELECT
Goals.ID,
Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10;
SELECT
Goal.ID,
Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10;

您不能对整个嵌套数据结构执行 SELECT。您只能明确列出属于其中的各个列。

对于 INSERT 查询,您应该分别传递嵌套数据结构的所有组件列数组(就像它们是单独的列数组一样)。在插入过程中,系统会检查它们的长度是否相同。

对于 DESCRIBE 查询,嵌套数据结构中的列以相同的方式单独列出。

对嵌套数据结构中元素的 ALTER 查询有限制。

15、元组

元组用于临时列分组。当在查询中使用 IN 表达式以及指定 lambda 函数的某些形式参数时,可以对列进行分组。有关详细信息,请参阅IN 运算符高阶函数部分

您可以使用函数来创建元组:

tuple(T1, T2, ...)

创建元组的示例:

SELECT tuple(1,'a') AS x, toTypeName(x)
SELECT tuple(1, NULL) AS x, toTypeName(x)

可以使用索引和名称读取命名元组的元素:

CREATE TABLE named_tuples (`a` Tuple(s String, i Int64)) ENGINE = Memory;

INSERT INTO named_tuples VALUES (('y', 10)), (('x',-10));

SELECT a.s FROM named_tuples;

SELECT a.2 FROM named_tuples;

SELECT
a.s,
a.i
FROM named_tuples;

16、Nullable

允许存储表示“缺失值”的特殊标记(NULL)以及 允许的正常值TypeName。例如,一个Nullable(Int8)类型列可以存储Int8类型值,没有值的行将存储NUL。

案例

CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();

INSERT INTO nullable VALUES (1) (NULL) (2) (NULL);

SELECT n.null FROM nullable;

17、特殊的数据类型

17.1 Expression

表达式用于表示高阶函数中的 lambda。

17.2 Set

用于IN表达式的右半部分。

17.3 Nothing

此数据类型的唯一目的是表示不需要值的情况。所以你不能创建一个Nothing类型值。

例如,文字NULL 的类型为Nullable(Nothing). 查看更多关于Nullable 的信息

Nothing类型还可用于表示空数组:

SELECT toTypeName(array());

17.4 Interval

表示时间和日期间隔的数据类型系列。INTERVAL运算符的结果类型。

Interval 数据类型值不能存储在表中。

结构:

  • 作为无符号整数值的时间间隔。

  • 间隔类型。

支持的间隔类型:

  • SECOND

  • MINUTE

  • HOUR

  • DAY

  • WEEK

  • MONTH

  • QUARTER

  • YEAR

对于每种间隔类型,都有一个单独的数据类型。例如DAY区间对应的IntervalDay数据类型:

SELECT toTypeName(toIntervalDay(4));

您可以Interval在具有DateDateTime类型值的算术运算中使用-type 值。例如,您可以将当前时间添加 4 天:

SELECT now() as current_date_time, current_date_time + INTERVAL 4 DAY;
select now() as current_date_time,current_date_time + interval 4 day + interval 4 hour;
  • 间隔运算符

  • toInterval类型转换函数

18、Domains

18.2 IPv4

IPv4是基于UInt32类型的域,用作存储 IPv4 值的类型化替代品。它以人性化的输入输出格式和检查列类型信息提供紧凑的存储。

CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY url;

DESCRIBE TABLE hits;
INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.com', '183.247.232.58')('https://clickhouse.com/docs/en/', '116.106.34.242');

SELECT * FROM hits;
SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
SELECT toTypeName(s), IPv4NumToString(from) as s FROM hits LIMIT 1;
SELECT toTypeName(i), CAST(from as UInt32) as i FROM hits LIMIT 1;

18.2 IPv6

IPv6是基于FixedString(16)类型的域,用作存储 IPv6 值的类型化替代品。它以人性化的输入输出格式和检查列类型信息提供紧凑的存储。

CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url;

DESCRIBE TABLE hits;
INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:3100::2')('https://clickhouse.com', '2001:44c8:129:2632:33:0:252:2')('https://clickhouse.com/docs/en/', '2a02:e980:1e::1');

SELECT * FROM hits;
SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
SELECT toTypeName(s), IPv6NumToString(from) as s FROM hits LIMIT 1;
SELECT toTypeName(i), CAST(from as FixedString(16)) as i FROM hits LIMIT 1;

19 Multiword Types

创建表时,您可以使用名称由多个单词组成的数据类型。这是为了更好的 SQL 兼容性而实现的。

Multiword types

Simple types

DOUBLE PRECISION

Float64

CHAR LARGE OBJECT

String

CHAR VARYING

String

CHARACTER LARGE OBJECT

String

CHARACTER VARYING

String

NCHAR LARGE OBJECT

String

NCHAR VARYING

String

NATIONAL CHARACTER LARGE OBJECT

String

NATIONAL CHARACTER VARYING

String

NATIONAL CHAR VARYING

String

NATIONAL CHARACTER

String

NATIONAL CHAR

String

BINARY LARGE OBJECT

String

BINARY VARYING

String

20、Geo Data Types

ClickHouse 支持用于表示地理对象的数据类型——位置、土地等。

警告

目前,地理数据类型是一项实验性功能。要使用它们,您必须设置allow_experimental_geo_types = 1.

另请参阅-表示简单的地理特征。- allow_experimental_geo_types设置。

Point由其 X 和 Y 坐标表示,存储为元组Float64Float64)。

SET allow_experimental_geo_types = 1;
CREATE TABLE geo_point (p Point) ENGINE = Memory();
INSERT INTO geo_point VALUES((10, 10));
SELECT p, toTypeName(p) FROM geo_point;

20.1 Ring

SET allow_experimental_geo_types = 1;
CREATE TABLE geo_ring (r Ring) ENGINE = Memory();
INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]);
SELECT r, toTypeName(r) FROM geo_ring;

20.2 Polygon

Polygon是一个带孔的多边形,存储为环数组:Array ( Ring )。外部数组的第一个元素是多边形的外形,后面的元素都是孔。

SET allow_experimental_geo_types = 1;
CREATE TABLE geo_polygon (pg Polygon) ENGINE = Memory();
INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]);
SELECT pg, toTypeName(pg) FROM geo_polygon;

20.3 MultiPolygon

这个多面体由两个独立的多边形组成——第一个没有孔,第二个有一个孔:

SET allow_experimental_geo_types = 1;
CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory();
INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]);
SELECT mpg, toTypeName(mpg) FROM geo_multipolygon;

21、Map(key, value)

map 目前还只是一个实验性的数据类型

set allow_experimental_map_type = 1;

Map(key, value)数据类型存储key:value对。

Map(key, value)数据类型存储key:value对。

参数

  • key——这对的关键部分。StringIntegerLowCardinalityFixedString

  • value— 对的值部分。StringIntegerArrayLowCardinalityFixedString

要从a Map('key', 'value')列中获取值,请使用a['key']语法。此查找现在以线性复杂度工作。


CREATE TABLE table_map (a Map(String, UInt64)) ENGINE=Memory;
INSERT INTO table_map VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});
SELECT a['key2'] FROM table_map;

如果列中没有这样key的内容Map(),则查询为数值、空字符串或空数组返回零。

INSERT INTO table_map VALUES ({'key3':100}), ({});
SELECT a['key3'] FROM table_map;

你可以投Tuple()作为Map()使用CAST功能:

SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;

为了优化Map列处理,在某些情况下,您可以使用keysvalues子列而不是读取整列。

CREATE TABLE t_map (`a` Map(String, UInt64)) ENGINE = Memory;

INSERT INTO t_map VALUES (map('key1', 1, 'key2', 2, 'key3', 3));

SELECT a.keys FROM t_map;

SELECT a.values FROM t_map;
  • 地图()函数

  • CAST()函数

22、SimpleAggregateFunction

支持以下聚合函数:

  • any

  • anyLast

  • min

  • max

  • sum

  • sumWithOverflow

  • groupBitAnd

  • groupBitOr

  • groupBitXor

  • groupArrayArray

  • groupUniqArrayArray

  • sumMap

  • minMap

  • maxMap

笔记

SimpleAggregateFunction(func, Type)外观值和存储方式与 相同Type,因此您不需要应用带有-Merge/-State后缀的函数。

SimpleAggregateFunction具有比AggregateFunction相同聚合函数更好的性能。


参数

  • 聚合函数的名称。

  • 聚合函数参数的类型。

CREATE TABLE simple (id UInt64, val SimpleAggregateFunction(sum, Double)) ENGINE=AggregatingMergeTree ORDER BY id;


Clickhouse每日一练,希望大佬能多多给宝贵意见,拿小本子记着。。。

文章转载自骚明的大数据之旅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论