DolphinDB脚本语言的混合范式编程
本页为文章《DolphinDB脚本语言的混合范式编程》,包含作者与发布日期信息,并引入DolphinDB脚本语言的设计动机与教程覆盖范围。
Source: https://dolphindb.cn/blogs/78
What this page covers
- 活动通知与报名入口信息。
- 文章基本信息与教程范围说明。
- 向量化编程范式、示例、优化与局限。
- SQL在DolphinDB中的定位与融合方式。
- 面板数据与时间序列相关能力要点。
- 函数式、RPC、分布式计算与元编程概览。
技能认证特训营第二期报名信息
页面顶部提供活动通知,并给出限时报名链接。
- 技能认证特训营第二期状态为“正式开启”。
- 页面提供报名链接入口。
DolphinDB脚本语言的混合范式编程
给出文章标题、作者与日期,并引入语言设计动机与教程覆盖范围。
- 文章作者署名为 Junxi。
- 文章发布日期为 2021-08-05。
- DolphinDB脚本语言从SQL与Python汲取设计灵感。
- 教程讲解混合范式用于快速开发大数据分析应用。
- 教程涉及语言与数据库、分布式计算的融合。
向量化编程
介绍向量化范式、优势、示例、滑动窗口优化,以及局限与应对方案。
- 向量化编程是DolphinDB中最基本的编程范式。
- 多数函数支持向量作为输入参数。
- 函数可按返回值分为聚合函数与向量函数。
- 向量化操作的优点包括代码更简洁。
- 在向量相加示例中,for循环耗时可高于向量化百倍以上。
- 滑动窗口移动平均的朴素计算复杂度为 O(nk)。
- 滑动窗口指标函数可将复杂度优化到 O(n)。
- 并非所有操作都能向量化,部分场景需要逐行迭代。
- 向量化计算可能需要连续内存,内存碎片会带来约束。
- big array用于将不连续内存块组织为逻辑连续向量。
SQL编程
说明SQL在DolphinDB中的定位,并引出与脚本语言融合及相关扩展方向。
- SQL被描述为面向问题的语言。
- DolphinDB脚本语言支持SQL标准功能。
- SQL能力针对大数据分析(含时间序列)有扩展以简化代码。
SQL与编程语言的融合
说明SQL作为语言子集/表达式的使用方式、可引用上下文变量与函数、可动态生成,并可操作多种数据结构。
- SQL语句在DolphinDB中是语言子集或一种表达式。
- SQL表达式可直接赋值给变量或作为函数参数。
- SQL语句中可使用上下文创建的变量和函数。
- 涉及分布式表时,相关变量与函数可自动序列化到节点。
- SQL语句可动态生成,而非仅作为字符串。
- SQL不仅操作table,也可操作scalar、vector、matrix等结构。
- DolphinDB语言区分大小写,SQL关键词必须使用小写。
- EXEC语句相对select可返回matrix、vector或scalar。
对面板数据(Panel Data)的友好支持(context by)
介绍context by子句能力与示例,并提供量化因子计算性能案例。
- context by被引入用于处理面板数据。
- 其他系统可用窗口函数处理组内行数保持问题。
- context by可与select配合查询,也可与update配合更新。
- context by可使用现有字段或计算字段进行分组。
- context by不限制可用函数,并支持任意表达式组合。
- context by可与having配合过滤组内行。
- Alpha98案例给出C#与DolphinDB的耗时对比描述。
对时间序列数据的友好支持(时间类型、建模、join)
描述时间精度转换、序列关系建模,以及asof join与window join,并给出示例与参考链接。
- 数据库采用列式存储,计算采用向量化编程。
- 支持不同精度的时间类型。
- 可通过SQL将高频数据转换为较低频数据(秒/分/小时)。
- 支持lead、lag、sliding window与cumulative window建模。
- 提供asof join与window join两种联结方式。
- 页面给出window join文档链接。
- window join在金融中可用于关联trades与quotes以计算交易成本。
- 对同一问题,其他系统实现的性能被描述为落后两个数量级以上。
SQL的其它扩展(UDF、库内计算、组合字段)
列举SQL扩展能力,包括UDF在SQL中的使用、库内计算与组合字段输出方式。
- UDF无需编译、打包和部署即可在SQL中使用。
- UDF可在本节点或分布式环境的SQL中使用。
- SQL与分布式计算框架被描述为紧密集成,便于库内计算。
- 支持composite column将多个返回值输出到表的一行。
- 组合字段输出需为简单键值对或数组。
- 页面给出组合字段相关用户手册链接。
命令式编程
介绍命令式语句类型与示例,并给出海量数据场景的建议。
- DolphinDB支持命令式编程。
- 目前支持18种语句(含赋值、if..else、for、do..while等)。
- 页面提供编程语句用户手册链接(第五章)。
- 不推荐对海量数据逐行使用for、if..else等控制语句。
- 更建议向量编程、函数编程与SQL编程等方式。
函数化编程
概述函数式能力与常见特性,并给出相关用户手册链接。
- 支持纯函数。
- 支持自定义函数(udf)与lambda函数。
- 支持高阶函数、部分应用与闭包。
- 页面提供函数式编程用户手册链接(第七章)。
自定义函数和lambda函数
说明函数的约束与作用域限制,并通过示例展示用法。
- 函数体内只能引用函数参数与函数内局部变量。
- 函数体内不能引用函数体外定义的变量。
- 该限制被描述为牺牲部分灵活性但有助于软件质量。
高阶函数(cross/each/pivot等)
将高阶函数作为数据处理模板进行解释,并提供示例与函数枚举。
- cross抽象了A与B元素两两计算并输出矩阵的模式。
- 页面枚举了多个模板高阶函数名称(示例)。
- 示例包含模拟生成10000000个数据点(tick相关性例)。
部分应用(Partial Application)与保持状态
解释{}与()语法、部分应用的用途,以及在状态保持中的示例。
- 函数调用使用(),部分应用使用{}。
- ratios函数示例被描述为eachPre的部分应用。
- 部分应用可用于高阶函数以确保参数符合要求(示例)。
- 部分应用可用于保持函数状态(示例:累计均值)。
远程过程调用编程(RPC)
介绍RPC系统与远程执行能力,并概述remoteRun与rpc相关用法。
- 分布式文件系统、数据库与计算框架采用原创RPC系统。
- 可通过RPC在远程机器上执行代码。
- 参数可为多种数据结构,也可为函数(含自定义函数)。
- 可使用独占连接或节点间共享连接。
使用remoteRun执行远程函数
展示通过xdb连接并用remoteRun/句柄执行脚本、注册函数与本地自定义函数等示例。
- remoteRun用于在远程节点执行已注册函数或本地自定义函数。
- 示例以xdb连接作为执行通道。
- 本地自定义函数可序列化到远程节点执行。
- 远程执行权限等同于当前登录用户在本地的权限。
使用rpc执行远程函数(集群内复用连接)
说明rpc的使用范围、连接复用优势与执行限制,并给出示例。
- rpc只能在同一集群内的控制节点与数据节点之间使用。
- rpc复用已有网络连接以节约资源并减少创建连接延迟。
- rpc在远程节点一次只能执行一个函数。
- 运行脚本需封装在自定义函数内。
- 只能在控制节点(master)上创建用户。
使用其它函数间接执行远程函数(pnodeRun等)
讨论允许执行本地自定义函数的差异与安全注意点,并提及pnodeRun等函数。
- DolphinDB可在远程节点执行用户在本地自定义的函数。
- 相关能力需要规划与设置用户访问权限。
- 自定义函数目前必须使用DolphinDB脚本开发。
- pnodeRun用于在多个节点并行运行同一函数并合并结果。
分布式计算(mr / imr)
介绍mr/imr框架,并通过分布式线性回归与近似中位数示例说明用法与一致性描述。
- mr用于基于MapReduce的分布式计算。
- imr用于基于迭代MapReduce的分布式计算。
- 分布式示例使用的数据规模包含10000000(示例参数)。
- 自定义分布式算法myOLSEx结果被描述与内置ols一致(示例)。
- 近似中位数示例使用bucketCount并迭代细分区间以满足精度要求。
元编程
解释元编程定义、目的与实现方式,并列举常用函数集合。
- 元编程指用程序代码创建可动态运行的程序代码。
- 元编程目的包括延迟执行或动态创建代码。
- 可用尖括号<>表示延后执行的动态代码。
- 也可用函数创建表达式来实现元编程。
- 页面列出常用元编程函数,如objByName、sql、eval等。
小结
对DolphinDB作为面向数据分析并与分布式数据库/计算紧密集成的语言特性进行收束描述。
- DolphinDB被描述为为数据分析而生的编程语言。
- 其与分布式数据库和分布式计算紧密集成。
- 被描述为具备处理海量数据的能力。
- 支持SQL编程、函数化编程与元编程(概述性表述)。
- 支持向量化计算与分布式计算(概述性表述)。
Facts index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 技能认证特训营第二期 | 状态 | 正式开启 | high |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| 文章《DolphinDB脚本语言的混合范式编程》 | 发布日期 | 2021-08-05 | high |
| 文章《DolphinDB脚本语言的混合范式编程》 | 作者署名 | Junxi | high |
| DolphinDB脚本语言 | 设计灵感来源 | 从流行的SQL和Python语言汲取灵感,设计了大数据处理脚本语言 | medium |
| 本教程 | 内容范围 | 讲解如何通过混合范式编程快速开发大数据分析应用,并介绍DolphinDB编程语言如何与数据库和分布式计算融合 | high |
| 向量化编程(DolphinDB) | 定位 | DolphinDB中最基本的编程范式 | high |
| DolphinDB函数(向量化) | 输入支持 | 绝大部分函数支持向量作为输入参数 | high |
| DolphinDB函数分类 | 分类方式 | 按返回值分为聚合函数(返回标量)与向量函数(返回与输入向量等长的向量) | high |
| 向量化操作 | 优点 | 代码简洁;大幅降低脚本语言解释成本;可对很多算法进行优化 | medium |
| DolphinDB用于时间序列数据分析 | 适用性原因 | 时间序列与列式数据库的列可用向量表示;DolphinDB作为内存计算引擎或分析型数据仓库时适合向量化编程 | medium |
| 示例:两长度为一千万的向量相加 | n值 | 10000000 | high |
| for循环 vs 向量化(向量相加示例) | 性能差异 | 使用for语句耗时是向量化编程的百倍以上 | medium |
| 滑动窗口移动平均计算复杂度 | 不批量计算复杂度 | O(nk)(n为数据量,k为窗口大小) | high |
| 滑动窗口移动平均计算复杂度 | 批量计算复杂度 | O(n) | high |
| DolphinDB滑动窗口指标函数 | 包含函数列表 | mmax, mmin, mimax, mimin, mavg, msum, mcount, mstd, mvar, mrank, mcorr, mcovar, mbeta, mmed | high |
| 示例:moving(avg, a, window) | Time elapsed | 4039.23 ms | high |
| 示例:mavg(a, window) | Time elapsed | 12.968 ms | high |
| 示例:mavg vs 每窗口avg | 性能差异 | 经过优化的mavg函数性能超过对每一个窗口使用avg函数300倍 | medium |
| 向量化编程 | 局限 | 不是所有操作都能向量化;某些机器学习/统计场景只能逐行迭代处理 | high |
| DolphinDB(计划) | 将推出的技术 | 后续版本计划推出即时编译技术(JIT),将for逐行处理代码运行时动态编译成机器码以显著提升性能 | medium |
| 向量化计算(内存) | 内存要求/问题 | 通常需要将整个向量加载到一段连续内存中;可能因内存碎片无法找到大段连续内存 | high |
| DolphinDB big array | 用途 | 将物理不连续内存块组成逻辑上连续的向量;是否采用由系统动态决定且对用户透明 | high |
| big array性能损耗 | 扫描损耗(相对连续内存) | 通常在1%~5%之间 | high |
| big array性能损耗 | 随机访问损耗 | 20%~30%左右 | high |
| DolphinDB big array取舍 | 目标 | 以可接受的少量性能损失换取更高可用性 | medium |
| SQL | 语言特性 | 面向问题的语言;用户描述问题,SQL引擎产生结果 | medium |
| DolphinDB脚本语言SQL语句 | 支持范围 | 不仅支持SQL标准功能,还为大数据分析(尤其时间序列大数据)做了很多扩展以简化代码 | medium |
| DolphinDB(脚本语言与SQL) | 融合方式 | SQL语句是DolphinDB语言子集/一种表达式,可直接赋给变量或作为函数参数 | high |
| DolphinDB SQL | 上下文变量/函数使用 | SQL语句中可使用上下文创建的变量和函数;若涉及分布式表,这些变量和函数会自动序列化到相应节点 | high |
| DolphinDB SQL | 动态生成 | SQL语句不再是简单字符串,而是可动态生成的代码 | high |
| DolphinDB SQL | 可操作对象 | 不仅操作table,也可对scalar、vector、matrix、set、dictionary等数据结构操作,且table可与其它数据结构转换 | high |
| DolphinDB编程语言 | 大小写规则 | 区分大小写;所有SQL关键词必须使用小写 | high |
| DolphinDB | exec关键词 | 与select相比,EXEC语句返回结果可以是matrix、vector或scalar,更便于数据分析 | high |
| DolphinDB | exec与pivot by | exec可与pivot by配合直接返回矩阵(示例) | high |
| DolphinDB SQL | 面板数据处理子句 | 引入context by子句处理面板数据 | high |
| 其它数据库系统 | 面板数据解决方式 | SQL Server、PostGreSQL等使用窗口函数(window function)解决保持组内行数的问题 | medium |
| context by vs 窗口函数 | 优势(语法/系统化/表达能力) | 语法更简洁;与group by、pivot by组成三类分组处理子句;表达能力更强 | medium |
| context by | 能力 | 可与select配合查询,也可与update配合更新数据 | high |
| context by | 分组字段范围 | 可使用任何现有字段和计算字段进行分组 | high |
| context by | 函数/表达式限制 | 不限制使用的函数,且可使用任意表达式(包括多个函数组合) | high |
| context by | 与having配合 | 可与having子句配合过滤每个组内部的行 | high |
| 案例:Alpha因子计算(98号) | 数据规模 | 中国股市3000多个股票、10年、近900万行历史数据 | medium |
| 案例:C#计算Alpha98 | 耗时 | 约30分钟 | medium |
| 案例:DolphinDB计算Alpha98 | 核心代码行数与耗时 | 4行核心代码,耗时仅2秒钟 | medium |
| 案例:性能提升幅度(Alpha98) | 提升量级 | 接近三个数量级的性能提升 | medium |
| DolphinDB(时间序列) | 存储与计算特性 | 数据库采用列式存储,计算采用向量化编程,对时间序列数据天然友好 | medium |
| DolphinDB时间类型 | 支持范围 | 支持不同精度的时间类型;可通过SQL将高频数据转换为不同精度的低频数据(秒/分/小时),也可用bar函数与group by转换任意时间间隔 | high |
| DolphinDB时间序列建模 | 支持关系 | 支持lead、lag、sliding window、cumulative window等序列关系建模 | high |
| DolphinDB时间序列常用指标/函数 | 性能相对其它系统 | 做了优化,性能优于其它系统1~2个数量级 | medium |
| DolphinDB表联结(时间序列) | 提供的联结方式 | asof join 和 window join | high |
| window join文档 | 参考链接 | https://www.dolphindb.cn/cn/help/windowjoin.html | high |
| window join vs 其它数据库实现(同一问题) | 性能差异 | 其它系统性能落后两个数量级以上(相对DolphinDB window join) | medium |
| window join(金融) | 典型应用 | 关联交易(trades)表与报价(quotes)表以计算交易成本 | high |
| DolphinDB SQL扩展 | UDF使用方式 | 用户自定义函数无需编译、打包和部署即可在本节点或分布式环境的SQL中使用 | high |
| DolphinDB SQL与分布式计算框架 | 集成效果 | 紧密集成,使库内计算(in-database analytics)更便捷高效 | medium |
| DolphinDB SQL | 组合字段 | 支持composite column,将复杂分析函数的多个返回值输出到数据表的一行 | high |
| 组合字段(DolphinDB) | 函数输出要求 | 输出必须是简单键值对(key-value pair)或数组;否则可用自定义函数转换 | high |
| 组合字段用户手册链接 | 参考链接 | https://www.dolphindb.cn/cn/help/groupby.html | high |
| DolphinDB | 命令式编程支持 | 支持命令式编程;目前支持18种语句(包括赋值、if..else、for、do..while等) | high |
| 编程语句用户手册链接(第五章) | 参考链接 | https://www.dolphindb.cn/cn/help/Chapter5ProgrammingStatements.html | high |
| 海量数据处理建议 | 不推荐方式 | 不推荐使用for、if..else等控制语句对数据逐行处理;更建议向量编程、函数编程、SQL编程等 | high |
| DolphinDB函数式编程 | 支持的功能 | 纯函数、自定义函数(udf)、lambda函数、高阶函数、部分应用、闭包 | high |
| 函数式编程用户手册链接(第七章) | 参考链接 | https://www.dolphindb.cn/cn/help/Chapter7FunctionalProgramming.html | high |
| DolphinDB函数(与Python对比) | 作用域限制 | 函数体内只能引用函数参数和函数内局部变量,不能使用函数体外定义的变量 | high |
| DolphinDB函数作用域限制 | 工程影响 | 牺牲一部分语法糖灵活性,但有助于提高软件质量 | low |
| DolphinDB高阶函数示例 | cross用途 | 将“A中任意元素与B中任意元素两两计算并产出m*n矩阵”的模式抽象为cross高阶函数 | high |
| DolphinDB模板高阶函数 | 函数列表(示例枚举) | all, any, each, loop, eachLeft, eachRight, eachPre, eachPost, accumulate, reduce, groupby, contextby, pivot, cross, moving, rolling | high |
| 示例:模拟生成数据点数量(tick相关性例) | n值 | 10000000 | high |
| DolphinDB部分应用语法 | 调用与部分应用 | 函数调用使用();部分应用使用{} | high |
| DolphinDB | ratios实现说明 | ratios函数的具体实现是高阶函数eachPre的一个部分应用 eachPre{ratio} | medium |
| 部分应用 | 用途之一 | 可用于高阶函数以确保参数符合要求(示例:corr{a}与each配合) | medium |
| 部分应用 | 用途之二 | 可使函数保持状态(示例:流计算消息处理累计均值cumavg) | high |
| DolphinDB RPC系统 | 应用范围 | 分布式文件系统、分布式数据库、分布式计算框架实现都采用DolphinDB原创的RPC系统 | medium |
| DolphinDB脚本语言(RPC) | 能力 | 可通过RPC在远程机器上执行代码 | high |
| DolphinDB RPC | 可执行函数类型 | 既可执行远程已注册函数,也可将本地自定义函数序列化到远程节点执行;远程执行权限等同于当前登录用户在本地权限 | high |
| DolphinDB RPC | 参数类型 | 参数可以是scalar, vector, matrix, set, dictionary, table,也可以是函数(包括自定义函数) | high |
| DolphinDB RPC | 连接方式 | 既可使用两个节点之间的独占连接,也可使用集群数据节点之间的共享连接 | high |
| remoteRun | 用途 | 在远程节点执行远程节点上注册函数或本地自定义函数(通过xdb连接) | high |
| rpc函数 | 使用范围 | 只能在同一集群内的控制节点及数据节点之间使用 | high |
| rpc函数 | 连接复用优势 | 不需创建新连接,复用已存在网络连接,可节约网络资源并免去创建连接延迟;用户很多时有意义 | medium |
| rpc函数 | 执行限制 | 只能在远程节点执行一个函数;运行脚本需封装在自定义函数内 | high |
| DolphinDB用户创建 | 限制 | 只能在控制节点(master)上创建用户 | high |
| DolphinDB RPC子系统 | 与其它RPC系统差异 | 可在远程节点执行用户在本地自定义的函数;其它系统客户端通常只能调用远程已暴露注册函数 | medium |
| 在远程节点执行自定义函数 | 实现语言限制 | 自定义函数目前必须使用DolphinDB脚本开发 | high |
| RPC与数据安全 | 要求 | 需要仔细规划和设置用户访问权限;若限制只能用注册函数,权限管理更简单(拒绝外部访问所有数据,仅授权访问注册视图函数) | medium |
| pnodeRun | 用途 | 在集群多个节点并行运行同一函数并合并返回结果 | high |
| DolphinDB分布式计算框架 | mr与imr | mr用于基于MapReduce的分布式计算;imr用于基于迭代MapReduce的分布式计算 | high |
| 分布式示例(线性回归/中位数) | n值 | 10000000 | high |
| 分布式线性回归示例 | 结果一致性 | 使用自定义分布式算法myOLSEx得到的系数与使用内置ols在未分区数据上得到相同结果 | high |
| 近似中位数算法示例 | 基本原理 | 利用bucketCount在每节点计算区间内计数并累加定位中位数区间,迭代细分区间至满足精度要求(使用imr) | high |
| 元编程 | 定义 | 使用程序代码创建可动态运行的程序代码;目的包括延迟执行或动态创建代码 | high |
| DolphinDB元编程 | 实现途径 | 使用尖括号<>表示延后执行的动态代码;或使用函数创建表达式 | high |
| DolphinDB元编程常用函数 | 函数列表 | objByName, sqlCol, sqlColAlias, sql, expr, eval, partial, makeCall | high |
| DolphinDB(小结) | 定位 | 为数据分析而生的编程语言 | medium |
| DolphinDB(与Matlab/SAS/pandas对比) | 差异点 | 与分布式数据库和分布式计算紧密集成,天生具备处理海量数据能力 | medium |
| DolphinDB | 支持的编程方式 | 支持SQL编程、函数化编程和元编程;语言简洁灵活、表达能力强,提高数据科学家开发效率 | low |
| DolphinDB | 性能描述 | 支持向量化计算和分布式计算,具有极快的运行速度 | low |