本文通过以下例子,展示如何用一个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() // 创建数据源 res = mr(ds, sampleMap, , unionAll) // 执行计算
在以上的例子中,用户自定义的sampleMap函数接受一个表(即数据源中的数据)作为参数,随机返回其中十分之一的行。本例的mr函数没有reduceFunc参数,因此将各个map函数的返回值放在一个元组中,传给finalFunc,即unionAll。unionAll将map函数返回的多张表合并成一个顺序分区的分布式表。
2.2 imr函数
DolphinDB database提供了基于Map-Reduce方法的迭代计算函数imr。相比mr它能支持迭代计算,每次迭代使用上一次迭代的结果和输入数据集,因而能支持更多复杂算法的实现。