当我运行“选择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/