DolphinDB通用计算教程

2022-03-28 00:00:00 数据 函数 分布式 数据源 计算

DolphinDB不仅可以分布式地存储数据,而且对分布式计算有良好支持。在DolphinDB中,用户可以用系统提供的通用分布式计算框架,通过脚本实现高效的分布式算法,而不需关注具体的底层实现。本文将对DolphinDB通用计算框架中的重要概念和相关函数作出详细解释,并提供丰富的具体使用场景和例子。


1. 数据源

数据源(Data Source)是DolphinDB的通用计算框架中的基本概念。它是一种特殊类型的数据对象,是对数据的元描述。通过执行数据源,用户可以获得诸如表、矩阵、向量等数据实体。在DolphinDB的分布式计算框架中,轻量级的数据源对象而不是庞大的数据实体被传输到远程结点,以用于后续的计算,这大大减少了网络流量。

在DolphinDB中,用户常用sqlDS函数,基于一个SQL表达式产生数据源。这个函数并不直接对表进行查询,而是返回一个或多个SQL子查询的元语句,即数据源。之后,用户可以使用Map-Reduce框架,传入数据源和计算函数,将任务分发到每个数据源对应的结点,并行地完成计算,然后将结果汇总。

关于几种常用的获得数据源的方法,本文的3.1, 3.2, 3.3, 3.4节中会详细介绍。


2. Map-Reduce框架

Map-Reduce函数是DolphinDB通用分布式计算框架的核心功能。

2.1 mr函数

DolphinDB的Map-Reduce函数mr的语法是mr(ds, mapFunc, [reduceFunc], [finalFunc], [parallel=true]),它可接受一组数据源和一个mapFunc函数作为参数。它会将计算任务分发到每个数据源所在的结点,通过mapFunc对每个数据源中的数据进行处理。可选参数reduceFunc会将mapFunc的返回值两两做计算,得到的结果再与第三个mapFunc的返回值计算,如此累积计算,将mapFunc的结果汇总。如果有M个map调用,reduce函数将被调用M-1次。可选参数finalFunc对reduceFunc的返回值做进一步处理。

官方文档中有一个通过mr执行分布式小二乘线性回归的例子。本文通过以下例子,展示如何用一个mr调用实现对分布式表每个分区中的数据随机采样十分之一的功能:

// 创建数据库和DFS表
db = database("dfs://sampleDB", VALUE, `a`b`c`d)
t = db.createPartitionedTable(table(100000:0, `sym`val, [SYMBOL,DOUBLE]), `tb, `sym)
n = 3000000
t.append!(table(rand(`a`b`c`d, n) as sym, rand(100.0, n) as val))

// 定义map函数
def sampleMap(t) {
    sampleRate = 0.1
    rowNum = t.rows()
    sampleIndex = (0..(rowNum - 1)).shuffle()[0:int(rowNum * sampleRate)]
    return t[sampleIndex]
}

ds = sqlDS(<select * from t>)              // 创建数据源
res = mr(ds, sampleMap, , unionAll)        // 执行计算

相关文章