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