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调研相关推荐

  1. 【大数据开发】ClickHouse——ClickHouse函数(全)

    -------------------------------------------------- ------------------------------------------------- ...

  2. clickhouse分布式表调研

    clickhouse分区表调研 文章目录 clickhouse分区表调研 1.搭建本地环境 1.1.搜索镜像是否存在 1.2.下载镜像 1.3.运行容器 1.4.修改密码 1.4.1.进入容器 1.4 ...

  3. 大数据之clickhouse安装部署

    一.clickhouse简介 ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(D ...

  4. ClickHouse入门到精通

    一 clickhouse-简介 ​ ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系 ...

  5. ClickHouse基础知识及与MySQL性能对比

    文章目录 ClickHouse介绍 如何理解OLTP和OLAP 如何理解行式存储和列式存储 ClickHouse应用场景 ClickHouse引擎 Log系列引擎 MergeTree系列表引擎 Col ...

  6. ClickHouse快速入门

    ClickHouse快速入门 学习目标 1).ClickHouse数据库概述.应用场景OLAP分析技术框架比较 2).ClickHouse 快速入门安装部署.服务启动.基本client使用 3).Cl ...

  7. clickhouse SQL查询语句 【译自Github 英文文档】

    内容有缩减,原文请点击这里 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name 创建表 CREATE TABLE可以有几种形式. 创建一张表,最好指定引擎结构 ...

  8. 云原生小课堂 | 一文入门性能凶悍的开源分析数据库ClickHouse

    clickhouse简介 ClickHouse是一个开源的,面向列的MPP架构数据分析数据库(大规模并行处理),由俄罗斯Yandex为OLAP和大数据用例创建. ClickHouse全称是Click ...

  9. ClickHouse基础

    ClickHouse基础 一.clickhouse-简介 1.ClickHouse优点 2.ClickHouse缺点 3.应用场景 4 核心概念 (1) 数据分片 (2)列式存储 (3) 向量化 (4 ...

最新文章

  1. 潜在狄利克雷分配(LDA,Latent Dirichlet Allocation)模型(三)
  2. 计算机控制系统的理论,计算机控制系统理论基础.pptx
  3. 数字证书管理工具keytool常用命令介绍
  4. 类和对象—友元—全局函数做友元
  5. Linux内核设计与实现学习笔记目录
  6. 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)
  7. 简单实现Popup弹出框添加数据
  8. c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)
  9. 企业应用单svn与apache+svn配置整理
  10. 4.3配置自定义情况的Bean实例
  11. wps linux 字体_真的好用!最近我被安利了一款Linux操作系统,我也想安利给你
  12. 国际贸易基础(六)外贸流程
  13. xp访问计算机组提示没有权限,WindowsXP系统提示没有权限使用网络怎么办
  14. 论文解读:Prediction of Protein–Protein Interaction Sites Using Convolutional Neural Network
  15. windows7系统的时间服务器,win7系统搭建ntp服务器的操作方法
  16. 如何取消福昕阅读器的手型光标里面的向下的箭头
  17. 《智能制造时代的研发智慧:知识工程2.0》一第3章 隐性知识的显性化
  18. Lr预设(手机+电脑):复古巧克力色电影灯室棕褐色摄影Lightroom滤镜调色预设
  19. Nvidia Xavier Nx平台PCIE速率调整调试记录
  20. 工厂模式与建造者模式

热门文章

  1. Excel--键盘操作(移动键及功能键)
  2. pandas处理数据
  3. dhcp服务器性能,配置dhcp服务器的总结
  4. 我想知道我可以通过哪些网络平台快速学会Creo软件
  5. 等比数列前N项和的公式推导
  6. 【物联网】28.物联网开发 - 安全性
  7. 世界上排名前三的大学
  8. AEO海关认证一般认证内部控制标准
  9. Eclipse通过SVN查看当前文件的提交记录
  10. Schema与schema文档