如何用@QuerySqlFunction实现SUM?

时间:2015-10-13 10:25:08

标签: gridgain ignite

到目前为止看到的涵盖 @QuerySqlFunction 的例子很简单。我在下面放了一个。但是,我正在寻找一个示例/解决方案/提示来提供交叉行计算,例如:平均,总和,......这可能吗?

在该示例中,函数从数组返回值0,基本上是ARRAY_GET(x,0)的实现。我见过的所有其他例子都是相似的:1行,得到一个值,用它做点什么。但我需要能够计算分组结果的总和,或者可能有更多的业务逻辑。如果有人可以为我提供了用于SUM的QuerySqlFunction,我认为这将允许我做的不仅仅是SUM。

第1步:编写函数

public class MyIgniteFunctions {
@QuerySqlFunction
public static double value1(double[] values) {
    return values[0];
}
}

第2步:注册功能

CacheConfiguration<Long, MyFact> factResultCacheCfg = ...
factResultCacheCfg.setSqlFunctionClasses(new Class[] { MyIgniteFunctions.class });

第3步:在查询中使用

SELECT
      MyDimension.groupBy1,
      MyDimension.groupBy2,
      SUM(VALUE1(MyFact.values))
FROM
     "dimensionCacheName".DimDimension,  
     "factCacheName".FactResult
WHERE
      MyDimension.uid=MyFact.dimensionUid
GROUP BY  
      MyDimension.groupBy1,
      MyDimension.groupBy2

1 个答案:

答案 0 :(得分:0)

我不相信Ignite目前对跨越多行的自定义用户定义的QuerySqlFunction提供了干净的API支持。

如果您需要这样的内容,我建议您使用IgniteCompute APIs并将计算,lambda或闭包分发给参与的Ignite节点。然后,从闭包内部,您可以执行本地SQL查询,或执行任何其他缓存操作,包括对本地缓存数据的基于谓词的扫描。

这种方法将在多个Ignite节点上并行执行,并且性能良好。