首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >apache calcite,不使用jdbc api进行查询

apache calcite,不使用jdbc api进行查询
EN

Stack Overflow用户
提问于 2016-03-29 19:36:12
回答 2查看 1.3K关注 0票数 6

我想使用apache calcite api raw,而不使用jdbc连接。我可以很好地使用jdbc api,但是在尝试使用该api时,我得到了null ptr异常。到目前为止,我所做的是:

代码语言:javascript
复制
package calcite.examples

import java.util.Properties

import calcite.demo.DemoSchema
import org.apache.calcite.DataContext
import org.apache.calcite.config.CalciteConnectionConfigImpl
import org.apache.calcite.jdbc.CalcitePrepare.Query
import org.apache.calcite.jdbc.{CalcitePrepare, CalciteSchema, JavaTypeFactoryImpl}
import org.apache.calcite.prepare.CalcitePrepareImpl

import scala.collection.JavaConverters._

object TryIt extends App
{
    val ctx = new AdapterContext
    val sql = Query.of[Any]("SELECT * FROM dep")
    //  assert(sql.rel != null)

    val elementType = classOf[Array[Object]]
    val prepared = new CalcitePrepareImpl().prepareSql(ctx, sql, elementType, -1)
    val enumerable = prepared.enumerable(new MyDataContext)
}

class AdapterContext extends CalcitePrepare.Context
{
    private val properties = new Properties
    private val rootSchema = CalciteSchema.createRootSchema(true)
    rootSchema.add("default", new DemoSchema)

    // default schema names
    override def getDefaultSchemaPath = List("default").asJava

    override def spark() = {
        val enable = config.spark
        CalcitePrepare.Dummy.getSparkHandler(enable)
    }

    override val config = new CalciteConnectionConfigImpl(properties)

    override val getTypeFactory = new JavaTypeFactoryImpl

    override def getRootSchema = rootSchema

    override def getDataContext = new MyDataContext
}

class MyDataContext extends DataContext
{
    override def get(name: String) = {
        println(s"MyDataContext name=$name")
        null
    }

    override def getTypeFactory = ???

    override def getQueryProvider = ???

    override def getRootSchema = ???
}

但是当我运行这个的时候,我得到了

MyDataContext name=v0stashed

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
at org.apache.calcite.interpreter.Interpreter.<init>(Interpreter.java:71)
at Baz.bind(Unknown Source)
at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:327)
at calcite.examples.TryIt$.delayedEndpoint$calcite$examples$TryIt$1(TryIt.scala:26)
at calcite.examples.TryIt$delayedInit$body.apply(TryIt.scala:18)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at calcite.examples.TryIt$.main(TryIt.scala:18)
at calcite.examples.TryIt.main(TryIt.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

注意,它试图从上下文中获取v0stashed,我不知道它应该是什么。我看到的唯一的CalcitePrepare.Context实现是一个使用CalciteConnection的am,我尽量避免使用它。另外,我从方解石文档中获取了一些代码片段,但它在方解石1.7中已经过时了

想法?

EN

回答 2

Stack Overflow用户

发布于 2019-03-30 03:31:02

显然,这里发生了一些疯狂的事情。您需要将从prepare调用中获得的internalParameters传递到DataContext中,并在get中查找它们。显然,Calcite使用它来传递query对象。您可能还想实现其他DataContext键(当前时间等)。

代码语言:javascript
复制
final class MyDataContext(rootSchema: SchemaPlus, map: util.Map[String, Object])
        extends DataContext {
    override def get(name: String): AnyRef = map.get(name)

...
}
代码语言:javascript
复制
// ctx is your AdapterContext from above
val prepared = new CalcitePrepareImpl().prepareSql(ctx, query, classOf[Array[Object]], -1)
val dataContext = new DerpDataContext(
  ctx.getRootSchema.plus(),
  prepared.internalParameters
)
票数 1
EN

Stack Overflow用户

发布于 2016-04-13 06:40:23

这应该差不多可以工作了,我用JdbcSchema修改了一些东西也是一样的。我的直觉是您正在尝试使用spark模式,仅从方解石中的版本号来判断,我认为它没有得到很好的维护。尝试一个更简单的模式,比如反射HR模式,或者JDBC模式,它应该可以工作,只需对您已有的内容进行一些小的更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36283160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档