问题标签 [apache-calcite]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
414 浏览

apache-calcite - Apache Calcite 查询 json 嵌套数据

我已经完成了使用方解石 sql 从 kafka 读取 json 格式的简单数据。有一个特殊要求,有如下嵌套数据

{"DATA":{"SPEED":80},"USER_ID":100200,"USER_NAME":"user1"}

而且我希望DATA.SPEED不只是DATA作为我的查询条件或像下面这样的条件

从“数据库”中选择 DATA.SPEED,其中 DATA.SPEED > 50 order by USER_ID desc

有没有办法做到这一点?谢谢

0 投票
1 回答
274 浏览

apache-flink - Flink SQL 中跳跃窗口上的指数衰减移动平均值:铸造时间

现在我们在 Flink 中有了带有花哨窗口的 SQL,我试图让衰减的移动平均线被“在未来的 Flink 版本中对于 Table API 和 SQL 都可能发生的事情”引用。来自他们的SQL 路线图/预览 2017-03 帖子

这是我的尝试(也受到方解石衰变示例的启发):

时间是处理时间,我们通过从 AppendStream 表创建 write_position 获得的 proctime 为:

我收到此错误:

我已经尝试将 proctime 转换为我所知道的所有其他类型(试图达到 NUMERIC 的应许之地),但我只是找不到如何使它工作。

我错过了什么吗?proctime 是一种您无法转换的非常特殊的“系统更改编号”时间吗?如果是这样,仍然必须有某种方法将其与 HOP_START(proctime,...) 值进行比较。

0 投票
1 回答
303 浏览

apache-flink - 在 Flink 的聚合原语中具有等效于 HOP_START

我试图在 Flink SQL 的跳跃窗口上做一个指数衰减的移动平均线。我需要有权访问窗口的边界之一,即以下 HOP_START:

我得到以下堆栈跟踪:

它确实说它在聚合 SUM 之外工作时是否未实现。所以这就是让我认为这是一个范围界定问题的原因。

现在,问题是:我可以转换这个表达式并在聚合之外进行最终处理,如 exp(x+y) = exp(x)*exp(y); 但我坚持使用 TIMESTAMPDIFF (这在我的上一期中创造了奇迹)。我还没有找到将 TIME ATTRIBUTE 转换为 NUMERIC 类型的方法;此外,即使我缩小它们,我也不喜欢对 UNIX 时间戳求幂。

无论如何,这种解决方法会有点笨拙,我可能还有另一种方法。我不知道如何在这个 SQL 片段中按摩作用域,使其仍然“处于”窗口作用域中,并且在不抛出的情况下获得开始时间。

0 投票
2 回答
431 浏览

csv - 为什么 Apache Calcite 为查询包含的所有表估计 100 行?

我最近尝试使用三个 CSV 文件作为表在 Apache Calcite 中执行查询

  • TTLA_ONE 包含 59 行
  • TTLR_ONE 包含 61390 行
  • EMPTY_T 包含 0 行

这是执行的查询:

查询的结果始终为零,因为我们正在加入一个空表。得到的方案是:

可以注意到,最后在计划中使用了空表。

我在此测试代码上添加了一个示例。

我更深入地研究了代码并打开了日志进行调试,我看到所有表行估计为 100,但事实并非如此。

下面,可以通过调试模式设置的日志找到计划估计:

我们可以肯定地看到,对于每个表,估计值始终为 100 rowcount = 100.0

查询正确执行,但计划未优化。有谁知道为什么没有正确评估表统计信息?

0 投票
1 回答
1225 浏览

mysql - Apache calcite:解析失败:遇到“来自\””

我目前正在尝试使用方解石连接 mysql。但是,我在执行 SQL 语句时遇到了问题

当我使用这个 sql 执行时,它可以工作。

ResultSet resultSet = statement.executeQuery("select * from ex.depts");

但我想访问一个名为“primary_test”的表,它失败了。

线程“main”java.sql.SQLException 中的异常:执行 SQL“select * from ex.primary_test”时出错:从第 1 行第 15 列到第 1 行第 29 列:在 org 的“ex”中找不到对象“primary_test” .apache.calcite.avatica.Helper.createException(Helper.java:56) 在 org.apache.calcite.avatica.Helper.createException(Helper.java:41) 在 org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement .java:163) 在 org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227) 在 CalciteMysqlConnectionIns.main(CalciteMysqlConnectionIns.java:44) 引起:org.apache.calcite.runtime.CalciteContextException:从行1,第 15 列到第 1 行,第 29 列:在 sun.reflect 的“ex”中找不到对象“primary_test”。NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor. java:423) 在 org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:463) 在 org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:787) 在 org.apache.calcite org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:4788) 处的 .sql.SqlUtil.newContextException(SqlUtil.java:772) org.apache.calcite.sql.validate.IdentifierNamespace.resolveImpl(IdentifierNamespace .java:166) 在 org.apache.calcite.sql.validate.IdentifierNamespace。org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) 上 org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:977) 上的 validateImpl(IdentifierNamespace.java:177)在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:953) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3050) 在 org.apache.calcite.sql .validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3032) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3302) 在 org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace .java:60) 在 org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) 在 org.apache.calcite。org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:953) 在 org.apache.calcite.sql.SqlSelect.validate(SqlSelect. java:216) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:632) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:928) 在 org.apache .calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:556) 在 org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:265) 在 org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java :231) 在 org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:772) 在 org.apache.calcite.prepare.CalcitePrepareImpl。prepare_(CalcitePrepareImpl.java:636) 在 org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:606) 在 org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:229) 在 org.apache .calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:550) at org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675) at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java :156) ... 2 更多原因:org.apache.calcite.sql.validate.SqlValidatorException:在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect 的“ex”中找不到对象“primary_test”。 NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources .java:463) 在 org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:572) ... 30 更多

我使用了许多不同的查询,例如

ResultSet resultSet = statement.executeQuery("select * from ex.\"primary_test\"");

但它不起作用。有人可以帮我解决这个问题吗?

我的代码如下:

0 投票
1 回答
402 浏览

sql - 重命名 SELECT 查询中的所有表

谁能告诉我如何替换 SELECT/FROM 语句中所有表名的名称?我正在寻找一种适用于普通查询以及具有子查询和连接的更复杂查询的方法。

IE

新表名:new_table 原始查询: SELECT * from table;

结果查询:SELECT * FROM new_table;

非常感谢,

j

0 投票
0 回答
22 浏览

apache-calcite - v1.18 中缺少 Schema.contentsHaveChangedSince

根据文档“JSON/YAML 模型”,“但是,它也会导致缓存过时的问题。特定的模式实现可以覆盖 Schema.contentsHaveChangedSince 方法来告诉 Calcite 何时应该认为其缓存已过期。” 但是在calcite v1.18中找不到方法,怎么实现这个功能呢?

0 投票
1 回答
760 浏览

sql - Apache NiFi QueryRecord SELECT 静态别名列

我想导入一个使用 Apache NiFi 分配了以下 Avro 架构的文件:

当我使用QueryRecord处理器时,我希望在输出文件中有一个静态字段,以便可以将其导入 MongoDB。查询是:

问题是方解石不会正确添加新的静态字段。它成功添加了名称,但新的性别字段仅包含单词的第一个字母:

0 投票
0 回答
418 浏览

sql - 如何在方解石中添加具有可变数字参数的 UDF?

我正在使用 Apache Calcite 来验证 SQL。我动态添加表和 UDF。问题是当我添加一个带有可变数字参数的 UDF 时,验证器找不到这个函数。

方解石的版本是 1.18.0

这是我的代码。

TestfuncFunction.java

添加 UDF

SQL

testfunc 是一个带有可变数字参数的 ScalarFunction,field1 和 field2 是 test_table 的列。所以这是一个合法的 SQL。但是我在验证时得到了这个 CalciteContextException:

我试图将我的 sql 更改为一个参数,如下所示:

并得到了这个例外

似乎方解石将java数组类型转换为SqlTypeName.OTHER。我试图在 JavaTypeFactoryImpl 中覆盖方法“createJavaType”,如下所示:

但它没有用。

Calcite 是否支持带有可变数字参数的 UDF,我该怎么办。

0 投票
2 回答
825 浏览

sql - 在 Apache Calcite 中将带有聚合函数的 SQL 查询转换为关系代数表达式 - 找不到函数签名的匹配项

我正在尝试使用 Apache Calcite 将 SQL 查询转换为关系代数表达式SqlToRelConverter

它适用于此查询(引号用于确保小写):

但是在这个查询中它失败了:

出现此错误:

org.apache.calcite.sql.validate.SqlValidatorException: No match found for function signature SUM(<NUMERIC>)

似乎 SQL 验证器以某种方式没有注册 sum 或 count 之类的聚合函数。