首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Apache Calcite |使用关系代数从MongoDB查询数据

Apache Calcite |使用关系代数从MongoDB查询数据
EN

Stack Overflow用户
提问于 2017-07-28 20:47:10
回答 2查看 1.2K关注 0票数 3

我能够获得MongoDB连接,并且能够获得节点

代码语言:javascript
运行
复制
(LogicalTableScan(table=[[enlivenDev, collection1]]))

但是当我执行节点时,我得到了空指针异常。

完整代码:

代码语言:javascript
运行
复制
private void executeMongoDB(){
        final FrameworkConfig config = mongoConfig().build();
        final RelBuilder builder = RelBuilder.create(config);
        final RelNode node =  builder.scan("collection1").build();
        System.out.println(RelOptUtil.toString(node));  
        PreparedStatement ps = RelRunners.run(node);
        ResultSet resultSet = ps.executeQuery();
}
    public static Frameworks.ConfigBuilder mongoConfig() {
            final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
            org.apache.calcite.tools.Frameworks.ConfigBuilder configBuilder =Frameworks.newConfigBuilder()
                    .parserConfig(SqlParser.Config.DEFAULT)
                    .defaultSchema(
                        MongoDBConnection.addMongoSchema(rootSchema, CalciteAssert.SchemaSpec.MONGO_DB))
                    .traitDefs((List<RelTraitDef>) null)
                    .programs(Programs.heuristicJoinOrder(Programs.RULE_SET, true, 2));
            return configBuilder;
        }
public static SchemaPlus addMongoSchema(SchemaPlus rootSchema, SchemaSpec schema) {
        switch (schema) {
        case MONGO_DB:
            return rootSchema.add("enlivenDev",
                    MongoSchemaFactory.create(rootSchema, "192.168.1.01", "enlivenDev", 27017, "mgp", "mg1"));
        default:
            throw new AssertionError("unknown schema " + schema);
        }
    }

从上面的代码中获得以下异常,在执行Mongo DB集合的relnode时,存在获取空值的模式

代码语言:javascript
运行
复制
SEVERE: exception while executing query: null
java.sql.SQLException: exception while executing query: null
    at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
    at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
    at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:540)
    at org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:133)
    at org.ramyam.eis.core.ApachecalcitePOC.processMongoDB(ApachecalcitePOC.java:106)
    at org.ramyam.eis.core.ApachecalcitePOC.main(ApachecalcitePOC.java:42)
Caused by: java.lang.NullPointerException
    at org.apache.calcite.schema.Schemas.queryable(Schemas.java:232)
    at Baz.bind(Unknown Source)
    at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:335)
    at org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:294)
    at org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:559)
    at org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:550)
    at org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:204)
    at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:67)
    at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:44)
    at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:536)
EN

回答 2

Stack Overflow用户

发布于 2017-11-21 23:12:30

这应该会有帮助:

代码语言:javascript
运行
复制
public void useCalcite(String modelPath) {
    Connection connection = DriverManager.getConnection("jdbc:calcite:model=" + modelPath);
    CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
    String query = "select count(*) from zips";
    Statement statement = calciteConnection.createStatement();
    ResultSet result = statement.executeQuery(query);
    ...
}

你需要一个你收藏的模型。如下所示:model-example模型文件包含建立到mongodb的连接所需的所有数据。

票数 0
EN

Stack Overflow用户

发布于 2021-06-18 02:12:33

上面由@1r3k发布的答案应该可以工作,对我来说,由于不同的原因,它在Apache方解石方面做了一些小的调整。

虽然这是一个不同的故事,与这个问题没有直接关系,但让我来阐述一下,这对有类似问题的人可能会有帮助。

我的用例是在Azure上的Cosmos DB上运行标准的SQL,它提供了MongoDB驱动程序来连接。

最新版本的Apache Calcite的问题是,它使用的是较旧的MongoDB Java驱动程序,并且已经很长一段时间没有更新了。还有一个主要缺陷是,它不接受Apache Calcite在内部创建MongoClient时可以传递和使用的任何选项,请参阅Apache Calcite https://github.com/apache/calcite/blob/master/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java中的以下代码片段

代码语言:javascript
运行
复制
MongoSchema(String host, String database,
  MongoCredential credential, MongoClientOptions options) {
super();
try {
  final MongoClient mongo = credential == null
      ? new MongoClient(new ServerAddress(host), options)
      : new MongoClient(new ServerAddress(host), credential, options);
  this.mongoDb = mongo.getDatabase(database);
} catch (Exception e) {
  throw new RuntimeException(e);
}}

这需要更新,并且已经提出了相同的PR,但不确定何时合并,详细信息在此处

https://github.com/apache/calcite/pull/2345

使用上面的更改和Model文件中的一个小更改就能够很好地连接。模型文件中的更改是只使用连接URL,而不是传递主机和其他详细信息。连接字符串将在其中编码所有必需的连接选项,包括启用SSL。

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

https://stackoverflow.com/questions/45373953

复制
相关文章

相似问题

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