AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

兼容 Presto、Trino、ClickHouse、Hive 近 10 种 SQL 方言,Doris SQL Convertor 解读及实操

  • 2024-03-27
    北京
  • 本文字数:5962 字

    阅读完需:约 20 分钟

大小:875.54K时长:04:58
兼容 Presto、Trino、ClickHouse、Hive 近 10 种 SQL 方言,Doris SQL Convertor 解读及实操

随着版本迭代,Apache Doris 一直在拓展应用场景边界,从典型的实时报表、交互式 Ad-hoc 分析等 OLAP 场景到湖仓一体、高并发数据服务、日志检索分析及批量数据处理,越来越多用户与企业开始将 Apache Doris 作为统一的数据分析产品,以解决多组件带来的数据冗余、架构复杂、分析时效性低、运维难度大等问题。


然而在架构统一和升级的过程中,由于部分大数据分析系统有自己的 SQL 方言、需要对 SQL 语法进行一定程度的修改,另外由于大量原有系统的 SQL 与业务逻辑相关联,需要进行大量业务逻辑的改造,这不可避免地增加了额外迁移成本。


为了帮助企业有效应对这些挑战,Apache Doris 2.1 版本提供了 SQL 方言兼容与转换方案—— Doris SQL Convertor,兼容了包括 Presto、Trino、Hive、ClickHouse、PostgreSQL 等在内多种 SQL 语法。 用户可以在 Doris 中直接使用相应系统的 SQL 语法执行查询,也可以在可视化界面对原有的 SQL 语句进行批量转换。通过 Doris SQL Convertor,能够有效减轻用户业务迁移成本,提供更加顺畅地业务迁移体验

核心特性

无缝切换,高度兼容多种 SQL 方言

无需手动对原有系统的 SQL 方言进行改写,用户仅需要在 Apache Doris 会话变量中设置 set sql_dialect= XXX,即可直接在 Doris 中执行该 SQL 语法的查询。


我们在实际客户场景中进行了大量兼容性测试,以 ClickHouse 和 Presto 方言为例。在某些社区用户的实际线上业务 SQL 兼容性测试中,Doris SQL Convertor 在全部 3 万多条查询语句中,与 Presto SQL 兼容度高达 99.6% ,与 ClickHouse 方言兼容度高达 98%。目前,Doris SQL Convertor 已支持了多种主流 SQL 方言,包括 Presto、Trino、Hive、ClickHouse、PostgreSQL 等。后续我们也将继续收集用户的反馈,在持续优化多种语法兼容性的同时,支持如 Teradata 、SQL Server、Snowflake 等更多方言,以满足用户更多样化的业务需求。

简单易用,支持一键批量生成

除了直接在命令行中执行查询 SQL 以外,我们还提供了可视化界面,支持文本输入和文件上传两种模式。对于单个 SQL,用户可以直接在 Web 界面中进行文本输入。如若存量 SQL 规模庞大,可以通过上传文件进行多个 SQL 的一键批量转换。


安装部署与使用介绍

服务部署与使用

1. 下载最新版本的 SQL 方言转换工具


2.在任意 FE 节点,通过以下命令启动服务。


  • 该服务是一个无状态的服务,可随时启停;

  • 该命令中的 port=5001 是服务端口,可以指定为任意一个可用端口。

  • 建议在每个 FE 节点都单独启动一个服务。


nohup ./doris-sql-convertor-1.0.1-bin-x86 run --host=0.0.0.0 --port=5001 &
复制代码


3.启动 Doris 集群,版本需为 Doris 2.1 或更高


4.在 Doris 中设置 SQL 方言转换服务的 URL。该命令中127.0.0.1:5001 是 SQL 方言转换服务的部署节点 IP 和端口。


MySQL> set global sql_converter_service_url = "http://127.0.0.1:5001/api/v1/convert"
复制代码


在完成服务部署后,我们可以直接在命令行中执行 SQL,在此以 Presto 与 Clickhouse SQL 方言为例。在会话变量中设置set sql_dialect = ``XXX 即可开启服务,执行示例如下:


Presto


mysql> set sql_dialect=presto;                                                                                                                                                                                                             Query OK, 0 rows affected (0.00 sec) 
mysql> SELECT cast(start_time as varchar(20)) as col1, array_distinct(arr_int) as col2, FILTER(arr_str, x -> x LIKE '%World%') as col3, to_date(value,'%Y-%m-%d') as col4, YEAR(start_time) as col5, date_add('month', 1, start_time) as col6, REGEXP_EXTRACT_ALL(value, '-.') as col7, JSON_EXTRACT('{"id": "33"}', '$.id')as col8, element_at(arr_int, 1) as col9, date_trunc('day',start_time) as col10 FROM test_sqlconvert where date_trunc('day',start_time)= DATE'2024-05-20' order by id; +---------------------+-----------+-----------+------------+------+---------------------+-------------+------+------+---------------------+ | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 | col9 | col10 | +---------------------+-----------+-----------+------------+------+---------------------+-------------+------+------+---------------------+ | 2024-05-20 13:14:52 | [1, 2, 3] | ["World"] | 2024-01-14 | 2024 | 2024-06-20 13:14:52 | ['-0','-1'] | "33" | 1 | 2024-05-20 00:00:00 | +---------------------+-----------+-----------+------------+------+---------------------+-------------+------+------+---------------------+ 1 row in set (0.03 sec)
复制代码


ClickHouse


mysql> set sql_dialect=clickhouse;                                                                                                                                             Query OK, 0 rows affected (0.00 sec)                                                                                                                                                                                                                                                                                                                          mysql> select  toString(start_time) as col1,                                                                                                                                                arrayCompact(arr_int) as col2,                                                                                                                                               arrayFilter(x -> x like '%World%',arr_str)as col3,                                                                                                                           toDate(value) as col4,                                                                                                                                                       toYear(start_time)as col5,                                                                                                                                                   addMonths(start_time, 1)as col6,                                                                                                                                             extractAll(value, '-.')as col7,                                                                                                                                              JSONExtractString('{"id": "33"}' , 'id')as col8,                                                                                                                             arrayElement(arr_int, 1) as col9,                                                                                                                                            date_trunc('day',start_time) as col10                                                                                                                                     FROM test_sqlconvert                                                                                                                                                         where date_trunc('day',start_time)= '2024-05-20 00:00:00'                                                                                                               order by id;                                                                                                                                                   +---------------------+-----------+-----------+------------+------+---------------------+-------------+------+------+---------------------+                                    | col1                | col2      | col3      | col4       | col5 | col6                | col7        | col8 | col9 | col10               |                                    +---------------------+-----------+-----------+------------+------+---------------------+-------------+------+------+---------------------+                                    | 2024-05-20 13:14:52 | [1, 2, 3] | ["World"] | 2024-01-14 | 2024 | 2024-06-20 13:14:52 | ['-0','-1'] | "33" |    1 | 2024-05-20 00:00:00 |                                    +---------------------+-----------+-----------+------------+------+---------------------+-------------+------+------+---------------------+                                    1 row in set (0.02 sec)
复制代码

可视化界面部署与使用

针对大规模历史业务逻辑转换的需求,推荐使用可视化界面,通过文件批量上传完成方言转换。


可视化界面的部署过程如下:


  1. 环境要求: docker 、docker-compose

  2. 获取 Doris-SQL-Convertor Docker 镜像包(文末附获取 Docker 镜像包方式)

  3. 创建镜像网络


      docker network create app_network
复制代码


  1. 解压安装包


      tar xzvf doris-sql-convertor-1.0.1.tar.gz            cd doris-sql-convertor
复制代码


  1. 编辑环境变量 vim .env


      FLASK_APP=server/app.py      FLASK_DEBUG=1      API_HOST=http://doris-sql-convertor-api:5000            # DOCKER TAG      API_TAG=latest      WEB_TAG=latest
复制代码


  1. 启动


      sh start.sh
复制代码


在部署完成后,可以在本地浏览器中通过 ip:8080 访问。当前默认端口为 8080,可以修改映射端口。在界面中,可直接选择来源方言,输入需要转换的 SQL 方言,并点击 Convert 实现转换。


提示:

  1. 进行批量转换时每条 SQL 需要以 ; 结束

  2. 最多支持 239 个 UNION ALL 转换

结束语

作为一款强大而易用的 SQL 方言转换工具,Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。无论是平滑无痕的方言转换,还是复杂的批量 SQL 处理任务,Doris SQL Convertor 都能够提供快速而稳定的转换体验,确保转化过程中的完整性与准确性。未来,我们将不断扩展支持更多的 SQL 方言并持续提高 SQL 方言的兼容性,以满足不断变化的迁移需求。

2024-03-27 20:527616
用户头像
李冬梅 加V:busulishang4668

发布了 1111 篇内容, 共 723.5 次阅读, 收获喜欢 1253 次。

关注

评论

发布
暂无评论
发现更多内容

Cloud Studio 云端开发保障企业源代码安全

CODING DevOps

软件工程 代码安全 Cloud Studio

Alien Skin Eye Candy 7 for Mac汉化激活(PS眼睛糖果滤镜) v7.2.3.189

真大的脸盆

Mac Mac 软件 PS滤镜插件 特效滤镜插件

工赋开发者社区 | Gartner发布2023年十大数据和分析趋势

工赋开发者社区

阿里巴巴“高并发”核心笔记!《基础+实战+源码+面试+架构》

程序知音

Java 并发编程 高并发 java架构 Java进阶

创新灵感来源于用户实践,TDengine 首次公开四项专利申请

爱倒腾的程序员

时序数据库 #TDengine taosdata

Cloud Studio 内核升级之持续优化

CODING DevOps

DevOps 软件工程 Cloud Studio 云端IDE

更高效便捷的开发体验——Cloud Studio 编辑器命令行工具

CODING DevOps

软件工程 研发效能 Cloud Studio 在线编辑

这年头怕数据泄露?全密态数据库:无所谓,我会出手

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

软件测试 | 如何运行JMeter

测吧(北京)科技有限公司

测试

机器学习平台PAI支持抢占型实例,模型服务最高降本90%

阿里云大数据AI技术

人工智能 机器学习

结合实例,解读华为云数字工厂信息模型配置器

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

软件测试 | 认识性能测试

测吧(北京)科技有限公司

测试

AIGC背后的技术分析 | 不止抠图、上色,看人工智能如何影响设计

TiAmo

AIGC AI绘画

DPU 厂商大禹智芯加入龙蜥社区,共建领先的 IT 基础设施

OpenAnolis小助手

开源 操作系统 龙蜥社区 DPU 大禹智芯

软件测试 | JMeter

测吧(北京)科技有限公司

测试

技术干货|如何利用 ChunJun 实现数据离线同步?

袋鼠云数栈

开源

免费下载|《建设数字中国 升级数智底座-企业数智化底座白皮书》

用友BIP

2023用友BIP技术大会

打造河南水务行业数智化标杆!中州水务电子化采购平台正式上线

用友BIP

北京.NET线下技术沙龙倒计时一天

MASA技术团队

.net MASA

Cloud Studio 内核升级之专注体验

CODING DevOps

软件工程 Cloud Studio 云端IDE

软件测试 |JMeter服务器模式、重置JMeter命令

测吧(北京)科技有限公司

测试

技术改变一切,实现企业数字化演变

智达方通

全面预算管理

如何让数据安全管理工作化繁为简?uDSP 十问十答

原点安全

数据库 数据安全 动态脱敏 分类分级 uDSP

Cloud Studio 内核升级之触手可及

CODING DevOps

软件工程 Cloud Studio 云端IDE

4.0 功能抢先看 | 读懂一个项目的研发效能 之 项目质量表现

思码逸研发效能

研发效能 项目质量

共享电动车生产批发厂家怎么找

共享电单车厂家

共享电动车厂家 共享电单车厂商 共享电动车生产

九大核心专题,630页内容,肝了23天吃透,我收割了6个Java岗offer

程序知音

java面试 java架构 Java进阶 后端技术 Java面试八股文

​GPT充当大脑,指挥多个模型协作完成各类任务,通用系统AutoML-GPT来了

工赋开发者社区

众筹一个标题,救救孩子!被选中的包食宿来参加奇妙敏捷之旅·青岛站!

禅道项目管理

敏捷 敏捷实践

软件测试 | 开源Web性能测试

测吧(北京)科技有限公司

测试

软件测试 | 配置JMeter

测吧(北京)科技有限公司

测试

兼容 Presto、Trino、ClickHouse、Hive 近 10 种 SQL 方言,Doris SQL Convertor 解读及实操_数据湖仓_SelectDB_InfoQ精选文章