阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移

简介: 阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。

2023 年 3 月,在阿里云瑶池数据库峰会上,阿里云与飞轮科技正式达成战略合作协议,双方旨在共同研发名为“阿里云数据库 SelectDB 版”的新一代实时数据仓库,为用户提供在阿里云上的全托管服务。
SelectDB 是飞轮科技基于 Apache Doris 内核打造的聚焦于企业大数据实时分析需求的企业级产品。因此阿里云数据库 SelectDB 版也延续了 Apache Doris 性能优异、架构精简、稳定可靠、生态丰富等核心特性,同时还融入了云服务随需而用的特性,通过云原生存算分离的创新架构,为企业带来分钟级弹性伸缩、高性价比、简单易用、安全稳定的一键式云上实时分析体验。
为了更深度的了解阿里云数据库 SelectDB 版,我们可以全面多角度的了解 Apache Doris 的应用实践和经验。

随着版本迭代,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 Convertor Playground

同时,为了让大家快速学习和使用 SQL 转化器,我们还提供了实操演示视频,详细展示使用方式和性能表现。

核心特性

01 无缝切换,高度兼容多种 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 等更多方言,以满足用户更多样化的业务需求。

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

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

doris-convertor.gif

安装部署与使用介绍

01 服务部署与使用

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)

02 可视化界面部署与使用

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

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

  1. 环境要求: docker 、docker-compose
  2. 获取 Doris-SQL-Convertor Docker 镜像包(文末附获取 Docker 镜像包方式)
  3. 创建镜像网络
       docker network create app_network
    
  4. 解压安装包

       tar xzvf doris-sql-convertor-1.0.1.tar.gz
    
       cd doris-sql-convertor
    
  5. 编辑环境变量 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
    
  6. 启动
       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 方言的兼容性,以满足不断变化的迁移需求。

目录
相关文章
|
11月前
|
SQL 人工智能 数据挖掘
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
Apache Doris 4.0 原生集成 LLM 函数,将大语言模型能力深度融入 SQL 引擎,实现文本处理智能化与数据分析一体化。通过十大函数,支持智能客服、内容分析、金融风控等场景,提升实时决策效率。采用资源池化管理,保障数据一致性,降低传输开销,毫秒级完成 AI 分析。结合缓存复用、并行执行与权限控制,兼顾性能、成本与安全,推动数据库向 AI 原生演进。
1082 0
Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
|
11月前
|
存储 自然语言处理 分布式计算
Apache Doris 3.1 正式发布:半结构化分析全面升级,湖仓一体能力再跃新高
Apache Doris 3.1 正式发布!全面升级半结构化分析,支持 VARIANT 稀疏列与模板化 Schema,提升湖仓一体能力,增强 Iceberg/Paimon 集成,优化存储引擎与查询性能,助力高效数据分析。
1228 4
Apache Doris 3.1 正式发布:半结构化分析全面升级,湖仓一体能力再跃新高
|
12月前
|
存储 分布式计算 Apache
湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
小米通过将 Apache Doris(数据库)与 Apache Paimon(数据湖)深度融合,不仅解决了数据湖分析的性能瓶颈,更实现了 “1+1>2” 的协同效应。在这些实践下,小米在湖仓数据分析场景下获得了可观的业务收益。
1666 9
湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
|
12月前
|
人工智能 运维 监控
智能运维与数据治理:基于 Apache Doris 的 Data Agent 解决方案
本文基于 Apache Doris 数据运维治理 Agent 展开讨论,如何让 AI 成为 Doris 数据运维工程师和数据治理专家的智能助手,并在某些场景下实现对人工操作的全面替代。这种变革不仅仅是技术层面的进步,更是数据运维治理思维方式的根本性转变:从“被动响应”到“主动预防”,从“人工判断”到“智能决策”,从“孤立处理”到“协同治理”。
1794 11
智能运维与数据治理:基于 Apache Doris 的 Data Agent 解决方案
|
12月前
|
消息中间件 OLAP Kafka
Apache Doris 实时更新技术揭秘:为何在 OLAP 领域表现卓越?
Apache Doris 为何在 OLAP 领域表现卓越?凭借其主键模型、数据延迟、查询性能、并发处理、易用性等多方面特性的表现,在分析领域展现了独特的实时更新能力。
919 9
|
10月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
1540 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
11月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
3440 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
720 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
12月前
|
消息中间件 存储 Kafka
Apache Flink错误处理实战手册:2年生产环境调试经验总结
本文由 Ververica 客户成功经理 Naci Simsek 撰写,基于其在多个行业 Flink 项目中的实战经验,总结了 Apache Flink 生产环境中常见的三大典型问题及其解决方案。内容涵盖 Kafka 连接器迁移导致的状态管理问题、任务槽负载不均问题以及 Kryo 序列化引发的性能陷阱,旨在帮助企业开发者避免常见误区,提升实时流处理系统的稳定性与性能。
885 0
Apache Flink错误处理实战手册:2年生产环境调试经验总结
|
12月前
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
1126 6

热门文章

最新文章

推荐镜像

更多