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

news/2024/4/27 18:22:58/文章来源:https://blog.csdn.net/SelectDB_Fly/article/details/136936678

随着版本迭代,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,能够有效减轻用户业务迁移成本,提供更加顺畅地业务迁移体验。

核心特性

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.gzcd doris-sql-convertor
    
  5. 编辑环境变量 vim .env

       FLASK_APP=server/app.pyFLASK_DEBUG=1API_HOST=http://doris-sql-convertor-api:5000# DOCKER TAGAPI_TAG=latestWEB_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 方言的兼容性,以满足不断变化的迁移需求。欢迎大家前往 Doris 问答论坛 反馈使用过程中的问题与建议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026680.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3气泡卡片(Popover)

效果如下图:在线预览 APIs 参数说明类型默认值必传title卡片标题string | slot‘’falsecontent卡片内容string | slot‘’falsemaxWidth卡片内容最大宽度string | number‘auto’falsetrigger卡片触发方式‘hover’ | ‘click’‘hover’falseoverlayStyle卡片样式…

不可变集合及Stream流

若希望某个数据是不可修改的,就可以考虑使用不可变集合,以提高安全性;(JKD9之后才有) List不可变集合: public static void main(String[] args) {/*创建不可变的List集合"张三", "李四&q…

蓝桥杯练习06给网页化个妆

给页面化个妆 介绍 各个网站都拥有登录页面,设计一个界面美观的登录页面,会给用户带来视觉上的享受。本题中我们要完成一个登录页面的布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: 其中&…

蓝桥杯2019年第十届省赛真题-组队

一、题目 组队 题目描述 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少? &#xff…

ubuntu - 编译 linphone-sdk

业务需求需要定制sdk,首先声明我们需要的是在Android4.4上跑的sdk,因此本次编译的sdk最低支持为19(不同版本需要的环境不一致),编译过程较容易,难点在于环境配置 环境准备 Ubuntu 18.04.6 android-sdk_r24.…

面试题:Java虚拟机JVM的组成

1. 基础概念 JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收机制 JVM由哪些部分组成,运行流程是什么? …

每日一题 --- 移除链表元素[力扣][Go]

移除链表元素 题目:203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出&#xf…

ViTAR: Vision Transformer with Any Resolution

ViTAR: Vision Transformer with Any Resolution 相关链接:arxiv 关键字:Vision Transformer、Resolution Adaptability、Adaptive Token Merger、Fuzzy Positional Encoding、High-Resolution Image Processing 摘要 本文解决了视觉Transformer&#x…

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试 1 Prerequisites1.1 C11 or C0x Compiler1.2 Pangolin1.3 OpenCV1.4 Eigen3 2 安装 Intel RealSense™ SDK 2.02.1 测试设备2.2 编译源码安装 (Recommend)2.3 预编译包安装 3 编译 ORB-S…

[密码学] 密码学基础

目录 一 为什么要加密? 二 常见的密码算法 三 密钥 四 密码学常识 五 密码信息威胁 六 凯撒密码 一 为什么要加密? 在互联网的通信中,数据是通过很多计算机或者通信设备相互转发,才能够到达目的地,所以在这个转发的过程中,如果通信包…

常见的三种办公室租赁方式各自优缺点

商业办公的租赁市场。找商业办公地点,跟找住宅租房有点像,但目的和要求不同。主要也是三种方式:直接找房东租、接手别人的转租,或者找中介帮忙。每种方式都有它的小窍门和注意事项。 直租 直租商业办公,就是直接和办公…

GPT提示词分享 —— 代码释义者

提示词👇 我希望你能充当代码解释者,阐明代码的语法和语义。 3.5版本👇 free2gpt 4.0版本👇 gpt4

互联网医院APP开发攻略:搭建智能医疗平台

互联网医院APP为患者提供了便捷的就医途径,还为医生和医院提供了更加高效的服务和管理手段。接下来,小编将我们本文将就互联网医院APP的开发攻略,以及如何搭建智能医疗平台进行探讨。 1.确定需求和目标 这包括确定服务对象(患者、…

鸿蒙HarmonyOS应用开发之C/C++标准库机制概述

OpenHarmony NDK提供业界标准库 libc标准库、 C标准库 ,本文用于介绍C/C标准库在OpenHarmony中的机制,开发者了解这些机制有助于在NDK开发过程中避免相关问题。 1. C兼容性 在OpenHarmony系统中,系统库与应用Native库都在使用C标准库&#…

基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】

基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 …

Sublime for Mac 使用插件Terminus

1. 快捷键打开命令面板 commandshiftp2. 选择 Package Control: Install Package,然后会出现安装包的列表 3. 在安装终端插件前,我们先装个汉化包,ChineseLocallization,安装完重启 4. 输入 terminus,选择第一个&am…

瑞吉外卖实战学习--登录功能的开发

登录功能的开发 前端1、创建实体类Employee和employee表进行映射,可以直接导入资料中提供的实体类1.1、字段名称对应上,有下划线的使用驼峰对应,因为在配置文件中进行了配置1.2、employee 文件 2、创建Controller、Service、Mapper2.1、Mapper文件2.2、定…

利用机器学习打造反电信诈骗系统

利用机器学习打造反电信诈骗系统 技术与功能数据集与模型可视化分析与词云结语 随着互联网的普及,电信诈骗日益猖獗,给人们的生活和财产安全带来了巨大的威胁。为了有效应对这一挑战,我们开发了一款基于机器学习的反电信诈骗系统,…

从后端到前端

原文地址:从后端到前端 - Pleasure的博客 下面是正文内容: 前言 在前面几章中主要介绍了系统开发的后端部分,但是验证接口的适用性只能通过专门的软件(Apifox,Postman等)来进行测试。那从现在开始&#xf…

mysql公用表表达式CTE

公用表达式是MySQL8.0的新特性,它是一个命名的临时结果集,作用范围是当前语句。 可以理解成为当前sql语句定义了一个视图,sql语句的任何地方都可以使用这个视图,如果被多次使用就体现出了公用表达式的特点公用。 依据语法结构和执…