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