【Clickhouse】clickhouse nested tuple调研
1. nested:
写入数据时可以写入和nested结构相同的json格式数据,如:
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory;INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]};
nested中的字段数据类型不能动态变化。
nested结构只有在join时可以整体操作,其余时候只能逐个字段操作。
CREATE TABLE test.testNestedPartition
(`date` date, `params` Nested(name String, val Int32)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY tuple()
nested在写入时每个字段只能写入Array。
:) insert into testNestedPartition(date, params.name, params.val) values('2020-05-20', 'param1', 333)INSERT INTO testNestedPartition (date, params.name, params.val) VALUESException on client:
Code: 53. DB::Exception: Type mismatch in IN or VALUES section. Expected: Array(Int32). Got: UInt64:) insert into testNestedPartition(date, params.name, params.val) values('2020-05-20', ['param1'], [222])INSERT INTO testNestedPartition (date, params.name, params.val) VALUESOk.
这就有个好处,nested中的字段长度可动态变化。例如:
SELECT *
FROM testNestedPartition┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [222] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [111] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name──────────────────┬─params.val────┐
│ 2020-05-20 │ ['param2','param3','param4'] │ [222,333,444] │
└────────────┴──────────────────────────────┴───────────────┘
而tuple则限定了这个字段元素个数必须统一。
ck提供了函数能将nested合并成一个map并对每个key进行求和:
:) select * from testNestedPartitionSELECT *
FROM testNestedPartition┌───────date─┬─params.name──────────────────┬─params.val────┐
│ 2020-05-20 │ ['param2','param3','param4'] │ [222,333,444] │
└────────────┴──────────────────────────────┴───────────────┘
┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [111] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [555] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [222] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name───────────────────────────┬─params.val────────┐
│ 2020-05-20 │ ['param5','param6','param7','param8'] │ [555,666,777,888] │
└────────────┴───────────────────────────────────────┴───────────────────┘:) select date, sumMap(params.name, params.val) as p from testNestedPartition group by dateSELECT date, sumMap(params.name, params.val) AS p
FROM testNestedPartition
GROUP BY date┌───────date─┬─p─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 2020-05-20 │ (['param1','param2','param3','param4','param5','param6','param7','param8'],[888,222,333,444,555,666,777,888]) │
└────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
key指定为params.name, value指定为params.val,相同key的值进行相加。
当对nested进行groupby时,需要显示指定nested中的字段:
:) select * from testNestedPartitionSELECT *
FROM testNestedPartition┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [555] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ ['param1'] │ [555] │
└────────────┴─────────────┴────────────┘
┌───────date─┬─params.name───────────────────────────┬─params.val────────┐
│ 2020-05-20 │ ['param1'] │ [111] │
│ 2020-05-20 │ ['param1'] │ [222] │
│ 2020-05-20 │ ['param2','param3','param4'] │ [222,333,444] │
│ 2020-05-20 │ ['param1'] │ [555] │
│ 2020-05-20 │ ['param5','param6','param7','param8'] │ [555,666,777,888] │
│ 2020-05-20 │ ['param5'] │ [555] │
└────────────┴───────────────────────────────────────┴───────────────────┘:) select date, params.name, params.val, count(*) as cnt from testNestedPartition group by date, params.name, params.valSELECT date, params.name, params.val, count(*) AS cnt
FROM testNestedPartition
GROUP BY date, params.name, params.val┌───────date─┬─params.name───────────────────────────┬─params.val────────┬─cnt─┐
│ 2020-05-20 │ ['param5'] │ [555] │ 1 │
│ 2020-05-20 │ ['param5','param6','param7','param8'] │ [555,666,777,888] │ 1 │
│ 2020-05-20 │ ['param1'] │ [222] │ 1 │
│ 2020-05-20 │ ['param1'] │ [111] │ 1 │
│ 2020-05-20 │ ['param1'] │ [555] │ 3 │
│ 2020-05-20 │ ['param2','param3','param4'] │ [222,333,444] │ 1 │
└────────────┴───────────────────────────────────────┴───────────────────┴─────┘
通过ARRAY JOIN关键字可以把nested字段的数组由行转列:
:) select date, params.name, params.val from testNestedPartition ARRAY JOIN paramsSELECT date, params.name, params.val
FROM testNestedPartition
ARRAY JOIN params┌───────date─┬─params.name─┬─params.val─┐
│ 2020-05-20 │ param1 │ 111 │
│ 2020-05-20 │ param1 │ 222 │
│ 2020-05-20 │ param2 │ 222 │
│ 2020-05-20 │ param3 │ 333 │
│ 2020-05-20 │ param4 │ 444 │
│ 2020-05-20 │ param1 │ 555 │
│ 2020-05-20 │ param5 │ 555 │
│ 2020-05-20 │ param6 │ 666 │
│ 2020-05-20 │ param7 │ 777 │
│ 2020-05-20 │ param8 │ 888 │
│ 2020-05-20 │ param5 │ 555 │
│ 2020-05-20 │ param1 │ 555 │
│ 2020-05-20 │ param1 │ 555 │
└────────────┴─────────────┴────────────┘
列转行:
select date, params.name, arrayFlatten(groupArray(params.val)) from testNestedPartition group by date, params.nameSELECT date, params.name, arrayFlatten(groupArray(params.val))
FROM testNestedPartition
GROUP BY date, params.name┌───────date─┬─params.name───────────────────────────┬─arrayFlatten(groupArray(params.val))─┐
│ 2020-05-20 │ ['param1'] │ [111,222,555,555,555] │
│ 2020-05-20 │ ['param5','param6','param7','param8'] │ [555,666,777,888] │
│ 2020-05-20 │ ['param2','param3','param4'] │ [222,333,444] │
│ 2020-05-20 │ ['param5'] │ [555] │
└────────────┴───────────────────────────────────────┴──────────────────────────────────────┘
可创建索引:
CREATE TABLE test.testNestedMapOrder
(`date` Date, `params` Nested(name String, val Int32)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY params.nameOk.0 rows in set. Elapsed: 0.006 sec.
2. tuple
可作为临时列来进行排序、group等操作。
可整体操作,通过tuple.N取名为tuple的元组的第N个元素。
对一个tuple进行order by时,会根据tuple中的每个元素进行排序:
SELECT *
FROM testTuple┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param1',666) │
└────────────┴────────────────┘
┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param2',777) │
└────────────┴────────────────┘
┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param1',123) │
│ 2020-05-20 │ ('param2',234) │
│ 2020-05-20 │ ('param3',345) │
└────────────┴────────────────┘:) select date, array(param) as params from testTuple order by param descSELECT date, [param] AS params
FROM testTuple
ORDER BY param DESC┌─date───────┬─params───────────┐
│ 2020-05-20 │ [('param3',345)] │
│ 2020-05-20 │ [('param2',777)] │
│ 2020-05-20 │ [('param2',234)] │
│ 2020-05-20 │ [('param1',666)] │
│ 2020-05-20 │ [('param1',123)] │
└────────────┴──────────────────┘
进行group by时,只有每个元素都相同才会进行合并。
SELECT *
FROM testTuple┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param2',777) │
└────────────┴────────────────┘
┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param1',666) │
└────────────┴────────────────┘
┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param1',123) │
│ 2020-05-20 │ ('param2',234) │
│ 2020-05-20 │ ('param3',345) │
└────────────┴────────────────┘
┌─date───────┬─param──────────┐
│ 2020-05-20 │ ('param1',666) │
└────────────┴────────────────┘:) select date, array(param) as params, count(*) as cnt from testTuple group by date, param order by param descSELECT date, [param] AS params, count(*) AS cnt
FROM testTuple
GROUP BY date, param
ORDER BY param DESC┌─date───────┬─params───────────┬─cnt─┐
│ 2020-05-20 │ [('param3',345)] │ 1 │
│ 2020-05-20 │ [('param2',777)] │ 1 │
│ 2020-05-20 │ [('param2',234)] │ 1 │
│ 2020-05-20 │ [('param1',666)] │ 2 │
│ 2020-05-20 │ [('param1',123)] │ 1 │
└────────────┴──────────────────┴─────┘
3. 泛型T
不存在泛型。
CREATE TABLE test.testTupleInArrayWithT
(`date` String, `param` Array(Tuple(String, T))
)
ENGINE = ReplicatedMergeTree()
ORDER BY tuple()Received exception from server (version 20.4.2):
Code: 50. DB::Exception: Received from localhost:9998. DB::Exception: Unknown data type family: T
【Clickhouse】clickhouse nested tuple调研相关推荐
- 【大数据开发】ClickHouse——ClickHouse函数(全)
-------------------------------------------------- ------------------------------------------------- ...
- clickhouse分布式表调研
clickhouse分区表调研 文章目录 clickhouse分区表调研 1.搭建本地环境 1.1.搜索镜像是否存在 1.2.下载镜像 1.3.运行容器 1.4.修改密码 1.4.1.进入容器 1.4 ...
- 大数据之clickhouse安装部署
一.clickhouse简介 ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(D ...
- ClickHouse入门到精通
一 clickhouse-简介 ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系 ...
- ClickHouse基础知识及与MySQL性能对比
文章目录 ClickHouse介绍 如何理解OLTP和OLAP 如何理解行式存储和列式存储 ClickHouse应用场景 ClickHouse引擎 Log系列引擎 MergeTree系列表引擎 Col ...
- ClickHouse快速入门
ClickHouse快速入门 学习目标 1).ClickHouse数据库概述.应用场景OLAP分析技术框架比较 2).ClickHouse 快速入门安装部署.服务启动.基本client使用 3).Cl ...
- clickhouse SQL查询语句 【译自Github 英文文档】
内容有缩减,原文请点击这里 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name 创建表 CREATE TABLE可以有几种形式. 创建一张表,最好指定引擎结构 ...
- 云原生小课堂 | 一文入门性能凶悍的开源分析数据库ClickHouse
clickhouse简介 ClickHouse是一个开源的,面向列的MPP架构数据分析数据库(大规模并行处理),由俄罗斯Yandex为OLAP和大数据用例创建. ClickHouse全称是Click ...
- ClickHouse基础
ClickHouse基础 一.clickhouse-简介 1.ClickHouse优点 2.ClickHouse缺点 3.应用场景 4 核心概念 (1) 数据分片 (2)列式存储 (3) 向量化 (4 ...
最新文章
- 潜在狄利克雷分配(LDA,Latent Dirichlet Allocation)模型(三)
- 计算机控制系统的理论,计算机控制系统理论基础.pptx
- 数字证书管理工具keytool常用命令介绍
- 类和对象—友元—全局函数做友元
- Linux内核设计与实现学习笔记目录
- 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)
- 简单实现Popup弹出框添加数据
- c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)
- 企业应用单svn与apache+svn配置整理
- 4.3配置自定义情况的Bean实例
- wps linux 字体_真的好用!最近我被安利了一款Linux操作系统,我也想安利给你
- 国际贸易基础(六)外贸流程
- xp访问计算机组提示没有权限,WindowsXP系统提示没有权限使用网络怎么办
- 论文解读:Prediction of Protein–Protein Interaction Sites Using Convolutional Neural Network
- windows7系统的时间服务器,win7系统搭建ntp服务器的操作方法
- 如何取消福昕阅读器的手型光标里面的向下的箭头
- 《智能制造时代的研发智慧:知识工程2.0》一第3章 隐性知识的显性化
- Lr预设(手机+电脑):复古巧克力色电影灯室棕褐色摄影Lightroom滤镜调色预设
- Nvidia Xavier Nx平台PCIE速率调整调试记录
- 工厂模式与建造者模式