当前位置:网站首页>功能尝鲜 | 解密 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源创计划”,欢迎正在阅读的你也加入,一起分享。
边栏推荐
- 【HarmonyOS议题资料下载】HDD杭州站·线下沙龙专注应用创新 展现鸿蒙生态魅力
- [JVM series] JVM tuning
- 【Oracle实训】-部署号称零停机迁移的OGG
- Redis面试题
- 2022-7-26 the seventh group of abstractions and interfaces
- Leetcode linked list problem -- 24. Exchange the nodes in the linked list in pairs (learn the linked list with one question and one article)
- Serial port communication failure
- 苹果官网罕见打折,iPhone13全系优惠600元;国际象棋机器人弄伤对弈儿童手指;国内Go语言爱好者发起新编程语言|极客头条
- Deployment of kubernetes
- Test cases should never be used casually, recording the thinking caused by the exception of a test case
猜你喜欢
随机推荐
基于Hough变换的直线检测(Matlab)
APaaS低代码平台(一) | 把复杂留给自己,把简单留给用户
使用 LSTM 进行多变量时间序列预测--问题汇总
GOM and GEE lander list file encryption tutorial
Introduction to the billing function of wechat payment
Explain the 190 secondary compiler (decoding table) module of SMR laminated hard disk of Western data in detail
微信支付的分账功能介绍
Broadcast voice H5 speechsynthesisutterance
ROS2节点通信实现零拷贝
flask 源码梗概
Leetcode hash table class
Interceptors
Is it reliable, reliable and safe to open an account with a low commission for funds in Galaxy Securities
Detailed illustration of B-tree and its implementation in C language
Using union to sort MySQL
Devsecops, speed and security
Ros2 node communication realizes zero copy
08_ UE4 advanced_ Start end pause menu UI
Error in render: “TypeError: data.slice is not a function“
GOM login configuration free version generate graphic tutorial


![[JVM series] JVM tuning](/img/6b/f7c402b2ff5fc4f11f9656a7a59873.png)






