- 缘起
在DolphinDB里,由于其脚本语言表达能力不限于标准SQL,可以定义内存表变量,分布式内存表,分布式表等,传统的 `select col1,col2 from db.tb` 这类sql,脚本解析引擎会优先将 from 子句中的内容识别为内存表变量,若要读取分布式表内容,必须要使用 select col1, col2 from loadTable("dfs://db", "table") where ...这种函数方式,显式提供dfs路径来加载分布式库。对于使用惯了标准SQL的数据库用户来说,这个写法怎么看怎么别扭 :P
因为吐槽的用户太多,开发团队终于引入了Catalog的概念来解决这个问题,目标是通过设定默认的catalog,解析引擎优先在catalog内搜索库表名的方式,实现标准SQL的写法,如: selelct * from db.table where... , 不再需要用loadTable这样的方式来定位分布式库和表。
- 入门
先从文档中心查找 "Catalog"关键字,找到一篇教程【数据目录Catalog】,介绍了新引入的catalog,schema的概念,以及与原系统数据库表概念的映射关系。教程里介绍了概念,但是实操类的信息比较少。
怎么创建数据目录?
原有的数据库怎样归类到不同数据目录下?
新建的数据库怎么指定数据目录?
带着这几个问题,我开始了摸索的过程。
- 上手
根据教程中的catalog相关函数表,初步定位了几个函数,跟本文的目标问题相关。
| setDefaultCatalog | 为当前 session 设置默认的 catalog |
| getCurrentCatalog | 查看当前 session 位于哪个 catalog 中 |
| existsCatalog | 检查指定 catalog 是否存在 |
| createCatalog | 创建一个 catalog |
| dropCatalog | 删除指定的 catalog |
| getAllCatalogs | 检索当前所有可用的 catalog |
| getSchemaByCatalog | 检索指定 catalog 中的所有 schema |
| createSchema | 把指定数据库添加到指定的 catalog 中 |
| dropSchema | 删掉指定 catalog 中的指定 schema |
| renameCatalog | 重命名 catalog |
| renameSchema | 重命名 schema |
目标是针对一个分布式库表执行如下语句
select * from tmpdb.pt
目前执行会报错
Syntax Error: [line #1] Cannot recognize the token tmpdb
下面通过设置catalog来达成目标。
- 创建一个数据目录
createCatalog(catalog="mycatalog")
- 为数据库指定数据目录 createSchema。把我测试用的库 loadTable("dfs://temp", "pt") 加进来, 目标是要将数据库名定义为tmpdb,所以通过schema的概念,把分布式路径 (历史原因,也作为数据库名使用) dfs://temp 映射成 tmpdb
createSchema(catalog="mycatalog", dbUrl="dfs://temp", schema="tmpdb")
到这一步,系统里已经形成了mycatalog/tmpdb/pt这样的目录结构,后续我们只要设定一下默认的数据目录mycatalog,就可以直接sql中通过db.table的方式访问数据表了。
- 指定默认的数据目录:
setDefaultCatalog(catalog="mycatalog")
- 执行目标SQL
select * from tmpdb.pt
执行成功!
DolphinDB引入Catalog概念,以解决标准SQL写法的不便。通过创建数据目录、指定数据库的数据目录,实现了通过db.table形式访问分布式表。本文档介绍了如何创建Catalog,将原有数据库归类,以及指定新数据库的数据目录,并通过实例展示了设置默认Catalog后,使用标准SQL查询数据的成功操作。
1653





