写点什么

兼容 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:527796
用户头像
李冬梅 加V:busulishang4668

发布了 1155 篇内容, 共 773.7 次阅读, 收获喜欢 1283 次。

关注

评论

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

软件测试|不会Python RPC,一篇文章教你入门

霍格沃兹测试开发学社

Golden Gate (GGX) ZK 预编译: 彻底改变游戏玩法,成本降低千倍

股市老人

SeaTunnel StarRocks 连接器的使用及原理介绍

StarRocks

数据库 大数据 OLAP 湖仓一体 大数据 开源

Taro框架应用优势下的移动App开发创新模式

FinFish

taro 跨端开发 小程序容器 跨端框架 小程序容器技术

【零售电商系列】走进电商

小诚信驿站

6 月 优质更文活动

硬核干货!一文掌握 binlog 、redo log、undo log

架构精进之路

MySQL 数据库 后端 6 月 优质更文活动

三分钟知识点 - 重构平滑升级

雨中山

GitOps 最佳实践(下)| 基于 Amazon EKS 构建 CI/CD 流水线

亚马逊云科技 (Amazon Web Services)

Kubernetes

重磅版本发布|三大关键特性带你认识 Milvus 2.2.9 :JSON、PartitionKey、Dynamic Schema

Zilliz

非结构化数据 Milvus Zilliz 向量数据库

ChatGPT与软件架构(3) - 软件架构提示工程

俞凡

人工智能 架构 ChatGPT

软件测试|Pytest必会技巧(二)

霍格沃兹测试开发学社

软件测试|Pytest必会技巧(三)

霍格沃兹测试开发学社

软件测试|Pytest必会技巧(四)使用autouse实现自动传参

霍格沃兹测试开发学社

面试官问:kafka为什么如此之快?

JAVA旭阳

kafka

精选一线企业最佳生产实践,《Apache Doris 用户案例集》重磅发布!

SelectDB

数据库 大数据 数据分析 实时数仓 Doris

软件测试|简单易学的性能监控体系prometheus+grafana搭建教程

霍格沃兹测试开发学社

ChatGPT与软件架构(2) - 基于Obsidian和GPT实现解决方案架构自动化

俞凡

人工智能 架构 ChatGPT

龙蜥社区 5 月度运营大事件回顾

OpenAnolis小助手

开源 总结 生态 龙蜥社区 运营月报

朱珠代言Moto razr40登618手机榜首,小折叠成新摩登主义造风者

科技之家

你说的是哪一种 IDP:内部开发者门户 OR 内部开发者平台?

杨振涛

DevOps 平台工程 内部开发者平台 内部开发者门户 IDP,

软件测试|手把手教你用Python来模拟绘制自由落体运动过程中的抛物线

霍格沃兹测试开发学社

三分钟知识点 - 如何选择编程语言

雨中山

小程序容器技术助力数字门户拓展多样化服务

FinFish

跨端开发 小程序容器 小程序容器技术 数字门户 移动门户

大模型时代下的企业系统架构变革

蔡超

架构 AI 大模型 GPT ChatGPT

inBuilder低代码平台特性推荐系列-第三期

inBuilder低代码平台

软件测试|PC端应用自动化最佳解决方案——Pywinauto

霍格沃兹测试开发学社

软件测试|Pytest的必会技巧(一)

霍格沃兹测试开发学社

ChatGPT与软件架构(4) - 架构师提示工程指南

俞凡

人工智能 架构 ChatGPT

软件测试|一步到位教会你Python字典操作(一)

霍格沃兹测试开发学社

软件测试|教你用skip灵活跳过用例

霍格沃兹测试开发学社

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