apache-flink - Apache Flink - 启用连接排序
问题描述
我注意到 Apache Flink 没有优化表的连接顺序。目前,它保持用户指定的连接顺序(基本上,它按字面意思接受查询)。我想 Apache Calcite 可以优化连接的顺序,但由于某种原因,这些规则在 Apache Flink 中没有使用。
例如,如果我们有两个表“ R ”和“ S ”
private val tableEnv: BatchTableEnvironment = TableEnvironment.getTableEnvironment(env)
private val fileNumber = 1
tableEnv.registerTableSource("R", getDataSourceR(fileNumber))
tableEnv.registerTableSource("S", getDataSourceS(fileNumber))
private val r = tableEnv.scan("R")
private val s = tableEnv.scan("S")
我们假设' S '是空的,我们想以两种方式连接这些表:
val tableOne = r.as("x1, x2").join(r.as("x3, x4")).where("x2 === x3").select("x1, x4")
.join(s.as("x5, x6")).where("x4 === x5 ").select("x1, x6")
val tableTwo = s.as("x1, x2").join(r.as("x3, x4")).where("x2 === x3").select("x1, x4")
.join(r.as("x5, x6")).where("x4 === x5 ").select("x1, x6")
如果我们要计算tableOne和tableTwo中的行数,两种情况下的结果都为零。问题是评估tableOne将比评估tableTwo花费更长的时间。
有没有什么方法可以自动优化join的执行顺序,甚至可以通过添加一些统计信息来启用可能的plan cost操作?如何添加这些统计信息?
在此链接的文档中,可能需要更改 Table 环境 CalciteConfig 但我不清楚如何去做。
请帮忙。
解决方案
由于 Flink 不能很好地处理统计信息,因此未启用 Join 重新排序。在没有准确估计基数的情况下重新排序连接基本上是赌博。因此,连接重新排序被禁用,表按照用户提供的顺序连接。这给出了确定性和可控的行为。
但是,您可以通过在创建时将 aTableConfig
和 a传递给优化器,即 TableEnvironment.getTableEnvironment(env, yourTableConfig)。您可以在其中将优化规则添加到不同的优化阶段。您可能希望将和添加到逻辑优化阶段。您可能还必须深入研究代码以检查如何将统计信息传递给优化器。CalciteConfig
TableEnvironment
CalciteConfig
JoinCommuteRule
JoinAssociateRule
推荐阅读
- android - Exoplayer 2 将媒体源更改为剪辑视频
- c# - 从基类中隐藏公共成员
- sql - 从过程 DB2 中的选择查询中获取 SQLCODE 和 SQLSTATE
- uml - 在 UML 活动图中表示“当 t < 时间限制”
- c# - 如何在使用 Linq 的 C# 中删除列表中的重复项,同时保留重复项中得分最高的元素
- javascript - 加载时如何在chrome android上保持媒体会话通知
- python - 启动脚本/Scrapy时修改文件路径
- laravel - 将分页组件或引导程序与 Laravel Nova 集成
- android-studio - 无法解决:play-services-base-license
- c++ - 如果代理服务器 Winhttp 认证失败