3

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

4

1 回答 1

1

我想谈谈我对此的理解。

首先,calcite 是专门进行 SQL 优化的数据操作引擎。所以它主要专注于找出最佳的执行计划。

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

在 的情况下csv adapter,我确实认为方解石会生成执行细节来运行聚合。正如您所建议的,可能全部都在内存中,如果 csv 文件足够大,就会出现 OOM。

是的,如果打开了 SPARK 选项。将使方解石能够生成SPAKR代码而不是普通java代码来执行物理计划。我认为是的,它会在一定程度上解决你提到的 OOM。

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

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' }]])");
于 2016-05-23T11:26:31.187 回答