如何避免方解石在内存中进行聚合

时间:2016-03-25 12:29:03

标签: apache-calcite

当我运行像“select count(x),y​​ group by y”之类的查询时,方解中执行内存中的所有计算。因此,如果有足够的数据,它可能会耗尽内存。有没有办法使用其他存储进行聚合?有一个spark选项,但是当我启用它时,我得到一个nullptr异常。这是否意味着使用spark来计算结果以及它是如何工作的?

1 个答案:

答案 0 :(得分:0)

我想谈谈我对此的理解。

首先,方解石是数据处理引擎,专门从事SQL优化。所以它主要侧重于找出最佳的执行计划。

calcite上有很多适配器。你当然可以选择将聚合下推到后端来执行。比如将聚合下推到后端mysql等......

csv adapter的情况下,我认为方解石将生成执行细节以运行聚合。正如你在内存中建议的那样,如果csv文件足够大,就会有OOM。

是的,SPARK选项,如果打开。将启用方解石生成SPAKR代码而不是普通java代码来执行物理计划。我假设它会在某种程度上解决你提到的OOM。

不幸的是,除了一些测试规范之外,我还没有找到使用SPARK运行calcite的官方介绍。

CalciteAssert.that()
        .with(CalciteAssert.Config.SPARK)
        .query("select *\n"
            + "from (values (1, 'a'), (2, 'b'))")
        .returns("EXPR$0=1; EXPR$1=a\n"
            + "EXPR$0=2; EXPR$1=b\n")
        .explainContains("SparkToEnumerableConverter\n"
            + "  SparkValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])");