OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator

今天为大家介绍一款来自 OpenMLDB 社区的优秀独立工具 - OpenMLDB SQL Simulator(https://github.com/vagetablechicken/OpenMLDBSQLEmulator) ,可以让你更加高效方便的开发、调试 OpenMLDB SQL。

为了高效的实现时序特征计算,OpenMLDB SQL 对标准 SQL 做了改进和扩展,因此初学者在使用 OpenMLDB SQL 的时候,经常会碰到语法不熟悉、执行模式混淆等问题。如果直接在 OpenMLDB 上进行开发、调试,由于部署、构建索引、大数据量等问题,经常会浪费大量时间在无关任务上,并且可能无法找到 SQL 本身的错误原因。OpenMLDB SQL Emulator 是一个轻量级 OpenMLDB SQL 模拟开发调试工具,可以在脱离 OpenMLDB 集群部署的情况下,进行 SQL 的验证和调试操作,堪称 OpenMLDB SQL 的开发调试神器。我们强烈推荐此工具给我们的应用开发人员,可以首先基于此工具快速验证 SQL 的正确性、可上线性以后,再切换到 OpenMLDB 真实环境上进行部署上线。

安装和启动

从项目页面下载运行包 emulator-1.0.jar https://github.com/vagetablechicken/OpenMLDBSQLEmulator/releases,使用如下方式启动(注意当前发布的 1.0 版本对应于 OpenMLDB 0.8.3 的 SQL 语法):

java -jar emulator-1.0.jar

注意,如果想使用 run 命令执行 SQL 来验证结果,还需要同时下载该页面下的 toydb_run_engine,并且存放在系统 /tmp 目录下。

创建虚拟数据库和表

启动后,将直接进入到默认的数据库 emudb,不需要额外创建数据库。

  • 数据库不需要被显式创建,只需要use <db name>或建表时指定数据库名,即可自动创建数据库。
  • 使用命令 addtable 或者 t 来创建虚拟表,重复创建同名表就是更新操作,将使用最新的表schema。我们使用简化的类 SQL 语法管理表,比如下面的例子创建了一个含有两列的表。
addtable t1 a int, b int64
  • 使用命令 showtables 或者 st 来查看当前所有的数据库和表。

验证 OpenMLDB SQL

OpenMLDB SQL 是否可以上线,在集群中可以使用 DEPLOY 进行上线测试,但是需要管理 DEPLOYMENT 与索引。例如,如果不需要某些测试用的 DEPLOYMENT,需要手动删除;如果创建了不需要的索引,还需要清理索引。所以,我们建议在 Emulator 中测试验证,你可以使用valvalreq分别进行在线批模式和在线请求模式(即服务部署上线)的 OpenMLDB SQL 验证。例如,我们测试一个 SQL 是否能被 DEPLOY 上线,使用 valreq 命令:

addtable t1 a int, b int64
valreq select count(*) over w1 from t1 window w1 as (partition by a order by b rows between unbounded preceding and current row);

如果测试不通过,将打印 SQL 编译错误;通过则打印“validate * success”。整个过程在虚拟环境中,无需担心建表后的资源占用,也没有任何副作用。只要 valreq 验证通过的 SQL,则一定能在真实集群中上线。

测试运行 OpenMLDB SQL

OpenMLDB Emulator 也可以返回计算结果,用于测试 SQL 计算是否符合预期。你可以在其中不断进行计算和上线验证,直到调试得到最终的上线SQL。该功能可以通过 Emulator 的 run 命令实现。注意,使用run命令需要额外的 toydb_run_engine 支持,可以使用自带 toydb 的 emulator 包,或在此页面下载 https://github.com/vagetablechicken/OpenMLDBSQLEmulator/releases) toydb 程序,并将其直接放入/tmp中。
假设 Emulator 已有 toydb,测试运行步骤如下:

# step 1, generate a yaml template
gencase
# step 2, modify the yaml file to add table and data
# ...
# step 3, load yaml to get table catalog, 
# then using val/valreq sql to validate the sql in emulator
loadcase
valreq <sql>
# step 4, dump the sql, this will rewrite the yaml file
dumpcase <sql>

# step 5, run sql using toydb
run

运行命令gencase将会生成一个yaml模版文件,默认创建目录为是/tmp/emu-case.yaml。然后,你需要编辑这个 yaml 文件,如下所示。编辑需要注意以下几点:

  • 你必须修改表名,表 schema 及其数据,这些不可在 Emulator 中修改。
  • 你可以修改运行 mode,接受 batch 或 request 模式。
  • 你可以不填写 SQL,可以在 Emulator 中通过dumpcase 写入文件。常见使用方法是,先validate SQL,SQL通过校验后dump到case中,再使用 run 命令确认 SQL 的计算符合预期。
  • 表的 indexs 也无需手动填写,dumpcase时可以根据表 schema 自动生成(indexs 并非特殊的索引,与 SQL 也无关,仅仅是创建表时需要创建至少一个索引)。如果你不使用dumpcase,那么请手动填写至少一个索引,索引没有特别要求。
# call toydb_run_engine to run this yaml file
# you can generate yaml cases for reproduction by emulator dump or by yourself

# you can set the global default db
db: emudb
cases:
  - id: 0
    desc: describe this case
    # you can set batch mode
    mode: request
    db: emudb # you can set default db for case, if not set, use the global default db
    inputs:
      - name: t1
        db: emudb # you can set db for each table, if not set, use the default db(table db > case db > global db)
        # must set table schema, emulator can't do this
        columns: ["id int", "pk1 string","col1 int32", "std_ts timestamp"]
        # gen by emulator, just to init table, not the deployment index
        indexs: []
        # must set the data, emulator can't do this
        data: |
          1, A, 1, 1590115420000
          2, B, 1, 1590115420000
    # query: only support single query, to check the result by `expect`
    sql: |

    # optional, you can just check the output, or add your expect
    # expect:
    #   schema: id:int, pk1:string, col1:int, std_ts:timestamp, w1_col1_sum:int, w2_col1_sum:int, w3_col1_sum:int
    #   order: id
    #   data: |
    #     1, A, 1, 1590115420000, 1, 1, 1
    #     2, B, 1, 1590115420000, 1, 1, 1

简单起见,我们不进行修改,直接使用这个模版来演示如何修改运行 case。在 Emulator 中,我们执行loadcase,这个 case 的表信息将被加载到 Emulator 中,可以通过st/showtables确认 case 的表加载成功。

emudb> st
emudb={t1=id:int32,pk1:string,col1:int32,std_ts:timestamp}

可以看到表信息已成功加载,我们就可以使用valreq来确认我们编写的 SQL 是语法正确且可以上线的。然后,可以对这个 SQL 进行计算测试,使用命令dumpcaserun,例如:

valreq select count(*) over w1 from t1 window w1 as (partition by id order by std_ts rows between unbounded preceding and current row);
dumpcase select count(*) over w1 from t1 window w1 as (partition by id order by std_ts rows between unbounded preceding and current row);
run

dumpcase实际是将 SQL 与默认索引写入 case 文件中,run 命令运行该 case 文件。所以,如果你足够熟练,也可以直接修改这个case文件,再在 Emulator 中使用 run 运行它,或直接使用toydb_run_engine --yaml_path=...来运行。运行后将会得到计算结果用于调试检查。

更多

OpenMLDB SQL Emulator 还有 genddl 功能,可以帮助用户根据 SQL 直接生成最佳索引的建表语句,避免冗余索引(目前仅支持单数据库)。未来将在索引处理上,提供更简单方便的操作,指导用户进行索引管理。此外,Emulator 交互使用上,建议多使用?help?list-all提示,命令均为小写,但参数填写的 SQL 不限制大小写,与 CLI 一致,SQL作为一个参数也不需要额外的双引号引用。未来将会增加命令历史、导出当前环境等功能,方便用户操作与对接真实 OpenMLDB 集群。

相关阅读

  • OpenMLDB 官网: https://openmldb.ai/
  • OpenMLDB GitHub 主页: https://github.com/4paradigm/OpenMLDB
  • OpenMLDB 文档: https://openmldb.ai/docs/zh/
  • OpenMLDB 微信交流群

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

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

相关文章

将对象转成URL参数

背景 有的时候前端跳转到其他平台的页面需要携带额外的参数&#xff0c;需要将对象转成用 & 连接的字符串拼接在路径后面。 实现方法

使用 pycryptodome 代替 pycrypto 2.6.1

老板认为加班是解决bug的良方&#xff0c;我的枕头却不这么认为。在这个被数字化和快速创新的时代&#xff0c;技术问题和bug是不可避免的。 老板建议我们继续加班&#xff0c;直到找到一个解决方案。然而&#xff0c;我有一个更好的建议&#xff1a;我们应该使用pycrypt…

下一代ETL工具:微服务架构的全新数据集成平台

当前对于大型企业来说数据的整合和加工变得越来越重要。随着业务需求的不断增长&#xff0c;企业数据量越来越大&#xff0c;数据管道越来越多&#xff0c;现有的ETL&#xff08;抽取、转换、加载&#xff09;工具已不再满足实时、高性能和微服务架构等现代化需求。因此&#x…

用EasyAVFilter将网络文件或者本地文件推送RTMP出去的时候发现CPU占用好高,用的也是vcodec copy呀,什么原因?

最近同事在用EasyAVFilter集成在EasyDarwin中做视频拉流转推RTMP流的功能的时候&#xff0c;发现怎么做CPU占用都会很高&#xff0c;但是视频没有调用转码&#xff0c;vcodec用的就是copy&#xff0c;这是什么原因呢&#xff1f; 我们用在线的RTSP流就不会出现这种情况&#x…

性能优化中使用Profiler进行页面卡顿的排查及解决方式

文章目录 一、前言二、页面卡顿的排查方式1、耗时操作的监控2、页面卡顿的监控 三、参考链接 一、前言 程序的优化在做过线上bug处理&#xff0c;布局层级优化&#xff0c;项目依赖库版本更新&#xff0c;重复库合并&#xff0c;删除未使用的资源&#xff0c;删除冗余的库&…

什么手机30万?VERTU唐卡手机顶配56.8万

近日,一则新闻在社交媒体上引发了广泛关注。一名男子遗失了一部价值30万的VERTU唐卡定制款手机,而一位女士在捡到这部手机后,误以为是一部普通的老年机,引发了种种误会。30万的手机是什么牌子?VERTU唐卡手机浮出水面 据了解,这部VERTU唐卡定制款手机是一款豪华的奢侈品定制手机…

OpenMLDB v0.8.4 诊断工具全面升级

新的v0.8.4版本中&#xff0c;我们对于诊断工具进行了全面系统化的升级&#xff0c;以提供更加完整和智能化的诊断报告&#xff0c;有助于高效排查 OpenMLDB 集群问题&#xff0c;大幅提升运维效率。 相比于之前的版本&#xff0c;新的诊断工具增添一键诊断功能&#xff0c;使…

一体化污水处理设备各种材质的优缺点

一体化污水处理设备的材质有多种&#xff0c;包括不锈钢、玻璃钢、聚乙烯塑料、碳钢等。每种材质都有其独特的优点和缺点。 不锈钢材质的优点是防腐性能好&#xff0c;耐磨损&#xff0c;使用寿命长&#xff0c;且外观美观。其缺点是成本较高&#xff0c;不适合在一些特殊的环…

【力扣:421,2935】数组内最大异或对问题

思路&#xff1a;从最高位向低位构造&#xff0c;对每一位利用哈希表寻找是否存在可使此位为1的数 第一轮找1&#xff1a;清空哈希表&#xff0c;1&#xff0c;2存1&#xff0c;到3发现1^01&#xff0c;res|1<<3 第二轮找11&#xff1a;清空哈希表&#xff0c;1存10&…

会员管理系统开发

一、引言 在当今竞争激烈的商业环境中&#xff0c;建立并维护良好的客户关系是任何企业都必须重视的关键因素。为了提高客户满意度和忠诚度&#xff0c;企业需要一个功能强大、高效的会员管理系统。本文将详细介绍如何开发一个成功的会员管理系统&#xff0c;以及它对企业的重…

宣传技能培训2——《图片后期处理与制作》光影魔术师:一小时速成Lightroom图片后期软件 + 案例分析

图片后期处理与制作&#xff1a;从理论到实践 写在最前面背景介绍夜间拍摄及其后期捕捉瞬间更重要 深入探索Lightroom&#xff1a;提升图片处理效率与质量软件设置与优化图片处理与预览GPU加速导入图片到LightroomLightroom界面概览图片筛选与比较删除不需要的图片 Lightroom进…

idea git将某个分支内的commit合并到其他分支

idea git将某个分支内的commit合并到其他分支 1.打开旧分支的代码提交记录 在IDEA中切换到新分支的代码&#xff0c;点击Git打开代码管理面板&#xff0c;在顶部点击Log:标签页&#xff08;这个标签页内将来可以选择不同分支的个人/所有人的代码commit记录&#xff09;&#x…

【数据结构】二叉树概念 | 满二叉树 | 完全二叉树

二叉树的概念 二叉树在实践中用的很多。 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 或者为空&#xff1b;由一个根结点加上两棵别称为左子树和右子树的二叉树组成。二叉树最多两个孩子。 这里注意&#xff1a;二叉树并不是度为2的树。 二叉树的度最大值是…

实现外卖配送的智能化:外卖配送可视化技术解析

随着互联网技术的不断发展&#xff0c;外卖配送行业也迎来了快速发展的时代。而随之而来的是越来越多的用户对于外卖配送的质量和效率提出了更高的要求。如何让外卖配送更加可视化&#xff0c;成为了外卖配送行业亟需解决的问题。 外卖配送可视化是指通过技术手段&#xff0c;将…

编程实例,随机抽奖编程

编程实例&#xff0c;随机抽奖编程 操作步骤&#xff1a; 1、将在本店消费的会员数据导入到抽奖池&#xff0c;可以设定最近多少天内的记录。 2、点击 开始随机抽奖&#xff0c;软件将从抽奖池随机抽取9名&#xff0c;并不断变化&#xff0c;每0.02秒重新随机抽取9名显示到屏…

vue2项目从0搭建(三):配置环境变量及对应的webpack配置

前言 实际业务开发中,一个项目很可能会同时配置好几套环境。 比如:常规开发环境,开发测试环境,正式的测试环境,预发测试环境,客户甲的生产环境,客户乙的生产环境,通用生产环境,独立应用环境,微前端环境,大屏专用环境,移动端环境。 一女多嫁的实际业务场景,就需要我们进行多样…

oracle rac环境归档日志清除

文章目录 一、处理步骤1、使用终端登录上服务器查看磁盘使用状态2、使用恢复备份管理工具RMAN删除归档日志 二、详细操作步骤三、定时任务自动清归档日志1、编写删除脚本4、测试脚本运行情况5、设置定时任务每周执行一次&#xff0c;并测试运行效果 昨天单位的所有系统都连不上…

进程已结束,退出代码-1073741571 (0xC00000FD)

今天遇到了一个很邪门的问题&#xff0c;没有报错&#xff0c;只是提示“进程已结束,退出代码-1073741571 (0xC00000FD)”。后来查资料说是栈溢出。 出问题的应该是上面这段代码。 这里我想把一个128*128的矩阵进行剪枝操作。 传入的128*128的矩阵太大了&#xff0c;两组for循…

rocketMQ5.0顺序消息golang接入

本人理解&#xff0c;顺序消息如果不分消息组&#xff0c;那么会影响并行处理速度&#xff0c;所以尽量消息组分的散一些 首先上要求&#xff0c;官方文档如下&#xff1a; 总结&#xff1a; 1.必须同一个消息组&#xff0c;消息组和消费组不是一个概念&#xff0c;不要混 2.必…

首个央企量子云计算项目,中标!

6月29日&#xff0c;北京玻色量子科技有限公司&#xff08;简称“玻色量子”&#xff09;成功中标中国移动云能力中心“2023—2024年量子算法及光量子算力接入关键技术研究项目”&#xff0c;这是玻色量子继与移动云签订“五岳量子云计算创新加速计划”后&#x1f517;&#xf…