当前位置:网站首页>功能尝鲜 | 解密 Doris 复杂数据类型 ARRAY
功能尝鲜 | 解密 Doris 复杂数据类型 ARRAY
2022-07-26 20:26:00 【ApacheDoris】

关于 ARRAY类型
复杂数据类型通常来说是现有类型的组合,一般都有直接访问和处理组合内数据的能力。常见的复杂类型有:ARRAY、MAP、STRUCT等。
Doris 复杂数据类型 ARRAY 已经可以在 master 分支先行体验,预计 1.2 版本发布。本文主要目的是介绍 Doris 复杂类型 ARRAY 的基本用法,方便有需要的小伙伴们进行体验。
ARRAY 基础用法
开启 ARRAY 开关
想要体验 ARRAY ,需要打开 ARRAY 类型开关 (enable_array_type)
sql> set enable_array_type=true;
第一步 创建带 ARRAY 列的表
语法为 ARRAY<T> ,T 为 ARRAY 的子类型。当前 ARRAY 支持的子类型有:BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, CHAR, VARCHAR, STRING
注:当前 ARRAY 仅支持 DUPLICATE KEY 数据模型上使用。
sql> CREATE TABLE `array_test` (`id` INT NULL,`c_array` ARRAY<INT> NULL) ENGINE=OLAPDUPLICATE KEY(`id`)DISTRIBUTED BY HASH(`id`) BUCKETS 5PROPERTIES ("replication_allocation" = "tag.location.default: 1");
第二步 导入 ARRAY 数据
ARRAY 列可以为 NULL、为空, ARRAY 内部也可以包含 NULL 元素
sql> INSERT INTO `array_test` VALUES(1, [1, 2, 3]), (2, [4, NULL, 5, NULL]), (3, []), (4, NULL);
第三步 查看 ARRAY 数据
sql> SELECT * FROM `array_test` ORDER BY `id`;+------+--------------------+| id | c_array |+------+--------------------+| 1 | [1, 2, 3] || 2 | [4, NULL, 5, NULL] || 3 | [] || 4 | NULL |+------+--------------------+
ARRAY 数据导入
当前 ARRAY 支持 Json、Parquet、Orc、Csv 格式的数据导入。下面以 Json 格式为例,介绍一下 ARRAY数据的导入:
第一步 数据准备
本地准备 Json 格式数据,带上 ARRAY 列:
[{"id": 1, "c_array": [1,2,3]}, {"id": 2, "c_array": [4,5]}]
第二步 数据导入
通过 stream load 方式将准备好的 json 测试数据导入到 Doris:
curl --location-trusted -u $user:$pwd -H "strip_outer_array: true" -H "format: json" -T local_json_input.json -XPUT http://127.0.0.1:$port/api/$db/$table/_stream_load{"TxnId": 13021,"Label": "1f83c4a1-43ad-49d6-8134-5d40f3fc35c3","TwoPhaseCommit": "false","Status": "Success","Message": "OK","NumberTotalRows": 2,"NumberLoadedRows": 2,"NumberFilteredRows": 0,"NumberUnselectedRows": 0,"LoadBytes": 61,"LoadTimeMs": 36,"BeginTxnTimeMs": 0,"StreamLoadPutTimeMs": 2,"ReadDataTimeMs": 0,"WriteDataTimeMs": 16,"CommitAndPublishTimeMs": 14}
第三步 查看导入结果
查看导入的结果,发现 ARRAY 数据已经导入成功:
sql> SELECT * FROM `array_test`;+------+-----------+| id | c_array |+------+-----------+| 1 | [1, 2, 3] || 2 | [4, 5] |+------+-----------+
ARRAY 相关函数介绍
复杂类型的优势在于可以直接访问和处理内部元素,Doris 提供了丰富的 ARRAY 处理函数。由于 Doris 用户跟 Hive 及 Spark 用户重叠度较高,Doris ARRAY 相关函数语法,跟 Hive 及Spark 语法相似度较高。
当前 ARRAY 支持的相关函数汇总如下表,更详细的语义及使用,可以在 Doris 手册中搜索对应函数。
注:ARRAY 相关函数,仅支持在向量化引擎中使用(set enable_vectorized_engine=true 打开)
Doris ARRAY 相关函数汇总 | |
函数 | 说明 |
element_at | 获取 ARRAY 中第N个元素 |
array_slice | 获取 ARRAY 中指定的部分元素 |
array_contains | 判断 ARRAY 是否包含某元素 |
array_position | 返回 ARRAY 中某元素第一个出现的位置 |
cardinality(size) | 返回 ARRAY 包含元素的数量 |
array_min | 返回 ARRAY 中最小的元素 |
array_max | 返回 ARRAY 中最大的元素 |
array_sum | 返回 ARRAY 中元素的累加和 |
array_avg | 返回 ARRAY 中元素的平均值 |
array_product | 返回 ARRAY 中元素的乘积 |
arrays_overlap | 判断两个 ARRAY 是否存在共同元素 |
array_union | 返回两个 ARRAY 的并集 |
array_intersect | 返回两个 ARRAY 的交集 |
array_except | 返回两个 ARRAY 的差集 |
array_sort | 对 ARRAY 中的元素进行排序 |
reverse(todo) | 将 ARRAY 中的元素反转 |
array_distinct | ARRAY 中元素去重 |
array_remove | 删除 ARRAY 中指定的元素 |
concat_ws | 将 ARRAY 中的元素拼接成String |
explode | ARRAY 列转行(需要配合Lateral View使用) |
| explode_outer | |
collect_list | ARRAY 行转列 |
| collect_set | |
ARRAY 行列转换举例
当我们在进行数据分析时,行转列、列转行的需求非常常见。下面分别举例看看 Doris 中 ARRAY 如何进行行列转换。
ARRAY 列转行
例如,有一张记录某人曾经任职过的公司的表 (array_demo_col)
sql> SELECT * FROM `array_demo_col` ORDER BY `name`;+----------+--------------------------------------+| name | companies |+----------+--------------------------------------+| lisi | ['companyB', 'companyT', 'companyD'] || zhangsan | ['companyA', 'companyT'] |+----------+--------------------------------------+
现在想要查看,哪些人曾经在 companyB 公司工作过,我们就可以通过 explode 列转行,然后针对性进行过滤来实现:
sql> SELECT `name` FROM `array_demo_col` LATERAL VIEW explode(`companies`) comTable AS company WHERE company='companyB';+------+| name |+------+| lisi |+------+
ARRAY行转列
继续以上面的表 (array_demo_col) 为例,如果我们想要按公司进行分组,曾经在该公司工作过的同事放到 ARRAY 列中。这时,我们就可以使用 collect_list 来进行行转列,具体示例SQL及效果如下:
sql> SELECT `company`,collect_list(`name`) AS namesFROM(SELECT `name`,`company`FROM `array_demo_col` LATERAL VIEW explode(`companies`) comTable AS company) AS array_demo_rowGROUP BY `company` ORDER BY `company`;+----------+----------------------+| company | names |+----------+----------------------+| companyA | ['zhangsan'] || companyB | ['lisi'] || companyD | ['lisi'] || companyT | ['lisi', 'zhangsan'] |+----------+----------------------+
总结
本文主要介绍了 Doris 复杂数据类型 ARRAY 数据的基本用法,能力列表以及使用中的一些限制,方便大家更好地了解和体验 ARRAY 数据类型。大家体验过程中有任何问题或者未覆盖的需求,请参考文末 意见反馈 部分与我们联系。
篇幅有限,ARRAY的实现原理等会在后续文章中逐步揭晓,欢迎大家关注 Apache Doris 官方公众号获取最新内容。
- 作者介绍 -
朱小力
百度 PALO 团队资深研发工程师,有丰富的存储引擎及大数据研发经验,擅长 Doris 执行引擎及存储引擎研发。是Apache Doris 复杂数据类型ARRAY主要实现者。
如果您遇到任何使用上的问题,欢迎随时通过 GitHub Discussion 论坛或者 Dev 邮件组与我们取得联系。
GitHub 论坛:https://github.com/apache/doris/discussions
Dev 邮件组:[email protected]
微信公众号:

Apache Doris官方网站:
http://doris.apache.org
Apache Doris Github:
https://github.com/apache/doris
Apache Doris 开发者邮件组:
精彩文章推荐
应用实践 | 知乎基于 Apache Doris 的 DMP 系统的架构与实践 技术实现 | Apache Doris 冷热数据存储(一) Apache Doris 技术实现 - 冷热数据存储(二) 应用实践 | Routine Load 导入 Kafka 数据消费延迟调优
本文分享自微信公众号 - ApacheDoris(gh_80d448709a68)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
边栏推荐
- Leetcode linked list problem - 19. Delete the penultimate node of the linked list (learn the linked list with one question and one article)
- idea中设置核心配置文件的模板
- 银河证券场内基金低佣金开户靠谱吗,可靠安全吗
- [ffmpeg] add timestamp summary to video files
- Test cases should never be used casually, recording the thinking caused by the exception of a test case
- Remember the idea of solving the problem of invalid bound statement xxxxx once
- [question] browser get request with token
- 【MySQL系列】-索引知多少
- 有关无线通信的相关内容
- APaaS低代码平台(一) | 把复杂留给自己,把简单留给用户
猜你喜欢

Daily practice ----- there is a group of students' grades. Arrange them in descending order. To add a student's grade, insert it into the grade sequence and keep the descending order

腾讯为什么没能造创造出《原神》这样的游戏

Rare discounts on Apple's official website, with a discount of 600 yuan for all iphone13 series; Chess robot injured the fingers of chess playing children; Domestic go language lovers launch a new pro

GOM登录器配置免费版生成图文教程

【MySQL系列】-索引知多少

2022开放原子全球开源峰会议程速递 | 7 月 27 日分论坛议程一览

Go+mysql+redis+vue3 simple chat room, the sixth bullet: use vue3 and element plus to call the interface

4年软件测试工作经验,跳槽之后面试20余家公司的总结

DeepFake捏脸真假难辨,汤姆·克鲁斯比本人还像本人!

JDBC connection
随机推荐
Redis面试题
What is the function of the serializable interface?
Ros2 method of obtaining current system time
idea中debug时如何进入指定的用户方法体中?
【HarmonyOS议题资料下载】HDD杭州站·线下沙龙专注应用创新 展现鸿蒙生态魅力
How to implement Devops with automation tools | including low code and Devops application practice
Redis hash和string的区别
JVM learning - memory structure - program counter & virtual machine stack & local method stack & heap & method area
洛谷-线段覆盖-(区间排序问题总结)
【HCIE安全】双机热备-主备备份
播报语音 h5 SpeechSynthesisUtterance
Introduction to the billing function of wechat payment
Interceptors
基于Hough变换的直线检测(Matlab)
Web3.0 时代,基于P2PDB实现一款Dapp的技术理论
Soft test --- database (1) database foundation
08_ UE4 advanced_ Start end pause menu UI
Relevant contents about wireless communication
2022 pole technology communication - anmou technology opens a new chapter of commercialization
Sign up now: July 29 recommendation system summit 2022