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

最佳答案

我想谈谈我对此的理解。

首先,方解石是专门用于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' }]])");

关于apache-calcite - 如何避免方解石在内存中做聚集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36219953/

10-15 10:37