现在有一个场景: 一个员工维表,一个订单表(监听mysql binlog的一个流表),想实时计算出所有员工的订单数;
目前flink-sql 支持Join Temporal Tables ,但是官方文档上是这么说的:仅支持带有处理时间的 temporal tables 的 inner 和 left join。 而这个场景必须是维表在左边,但实际情况是维表在左边无法进行left join :会报错:ClassCastException: org.apache.calcite.rel.logical.LogicalProject cannot be cast to org.apache.calcite.rel.core.TableScan;(如果是流表在左边,然后用temporal join 一个维表那么没有问题,即:left join 维表 FOR SYSTEM_TIME AS OF proctime) 想问下各位,碰到这类情况,大家是怎么处理的 |
我理解这个场景下 员工维表在右边没啥问题。 join过程中需要去员工维表拿哪些字段? 夜思流年梦 wrote > 现在有一个场景: 一个员工维表,一个订单表(监听mysql binlog的一个流表),想实时计算出所有员工的订单数; > 目前flink-sql 支持Join Temporal Tables ,但是官方文档上是这么说的:仅支持带有处理时间的 temporal > tables 的 inner 和 left join。 > 而这个场景必须是维表在左边,但实际情况是维表在左边无法进行left join :会报错:ClassCastException: > org.apache.calcite.rel.logical.LogicalProject cannot be cast to > org.apache.calcite.rel.core.TableScan;(如果是流表在左边,然后用temporal join > 一个维表那么没有问题,即:left join 维表 FOR SYSTEM_TIME AS OF proctime) > 想问下各位,碰到这类情况,大家是怎么处理的 -- Sent from: http://apache-flink.147419.n8.nabble.com/ |
Administrator
|
我理解楼主的场景不是 temporal join 的场景,而是双流 join
的场景,因为任何一条流的变化,都希望触发对结果的更新,所以讲员工作为右边维度表是不行的。 如果是我理解的这样的话,你可以用 flink-cdc-connectors [1] 去对接员工和订单两个 binlog 流,然后直接 join,然后聚合订单数。伪代码如下: create table users ( user_id bigint, ... ) with ( connector = mysql-cdc ... ); create table orders ( order_id bigint, user_id bigint, ... ) with ( connector = mysql-cdc ... ); select user_id, count(*) as order_num from (select * from users left join orders on users.user_id = orders.user_id) group by user_id; [1]: https://github.com/ververica/flink-cdc-connectors On Mon, 12 Oct 2020 at 15:17, caozhen <[hidden email]> wrote: > > 我理解这个场景下 员工维表在右边没啥问题。 > > join过程中需要去员工维表拿哪些字段? > > > > 夜思流年梦 wrote > > 现在有一个场景: 一个员工维表,一个订单表(监听mysql binlog的一个流表),想实时计算出所有员工的订单数; > > 目前flink-sql 支持Join Temporal Tables ,但是官方文档上是这么说的:仅支持带有处理时间的 temporal > > tables 的 inner 和 left join。 > > 而这个场景必须是维表在左边,但实际情况是维表在左边无法进行left join :会报错:ClassCastException: > > org.apache.calcite.rel.logical.LogicalProject cannot be cast to > > org.apache.calcite.rel.core.TableScan;(如果是流表在左边,然后用temporal join > > 一个维表那么没有问题,即:left join 维表 FOR SYSTEM_TIME AS OF proctime) > > 想问下各位,碰到这类情况,大家是怎么处理的 > > > > > > -- > Sent from: http://apache-flink.147419.n8.nabble.com/ |
In reply to this post by caozhen
是这样子的,比如要统计所有员工的今天的订单数量,如果是订单表left join 员工表的话,那么今天没有订单数量的就无法出现在结果表集合中;
把员工表放在左边left join 订单表的话那么就是所有员工的今天订单数量都会 出现 在 2020-10-12 15:17:07,"caozhen" <[hidden email]> 写道: > >我理解这个场景下 员工维表在右边没啥问题。 > >join过程中需要去员工维表拿哪些字段? > > > >夜思流年梦 wrote >> 现在有一个场景: 一个员工维表,一个订单表(监听mysql binlog的一个流表),想实时计算出所有员工的订单数; >> 目前flink-sql 支持Join Temporal Tables ,但是官方文档上是这么说的:仅支持带有处理时间的 temporal >> tables 的 inner 和 left join。 >> 而这个场景必须是维表在左边,但实际情况是维表在左边无法进行left join :会报错:ClassCastException: >> org.apache.calcite.rel.logical.LogicalProject cannot be cast to >> org.apache.calcite.rel.core.TableScan;(如果是流表在左边,然后用temporal join >> 一个维表那么没有问题,即:left join 维表 FOR SYSTEM_TIME AS OF proctime) >> 想问下各位,碰到这类情况,大家是怎么处理的 > > > > > >-- >Sent from: http://apache-flink.147419.n8.nabble.com/ |
In reply to this post by Jark
你好,我最开始也考虑用双流join,但是双流join 就会碰到一个问题,就是结果集只会包含今天有订单的员工数据,那么没有订单的员工数据是不会体现到结果集的。主要是需要所有员工今天的订单数量; 在 2020-10-12 15:37:51,"Jark Wu" <[hidden email]> 写道: >我理解楼主的场景不是 temporal join 的场景,而是双流 join >的场景,因为任何一条流的变化,都希望触发对结果的更新,所以讲员工作为右边维度表是不行的。 > >如果是我理解的这样的话,你可以用 flink-cdc-connectors [1] 去对接员工和订单两个 binlog 流,然后直接 >join,然后聚合订单数。伪代码如下: > >create table users ( > user_id bigint, > ... >) with ( > connector = mysql-cdc > ... >); > >create table orders ( > order_id bigint, > user_id bigint, > ... >) with ( > connector = mysql-cdc > ... >); > >select user_id, count(*) as order_num >from (select * from users left join orders on users.user_id = >orders.user_id) >group by user_id; > > >[1]: https://github.com/ververica/flink-cdc-connectors > >On Mon, 12 Oct 2020 at 15:17, caozhen <[hidden email]> wrote: > >> >> 我理解这个场景下 员工维表在右边没啥问题。 >> >> join过程中需要去员工维表拿哪些字段? >> >> >> >> 夜思流年梦 wrote >> > 现在有一个场景: 一个员工维表,一个订单表(监听mysql binlog的一个流表),想实时计算出所有员工的订单数; >> > 目前flink-sql 支持Join Temporal Tables ,但是官方文档上是这么说的:仅支持带有处理时间的 temporal >> > tables 的 inner 和 left join。 >> > 而这个场景必须是维表在左边,但实际情况是维表在左边无法进行left join :会报错:ClassCastException: >> > org.apache.calcite.rel.logical.LogicalProject cannot be cast to >> > org.apache.calcite.rel.core.TableScan;(如果是流表在左边,然后用temporal join >> > 一个维表那么没有问题,即:left join 维表 FOR SYSTEM_TIME AS OF proctime) >> > 想问下各位,碰到这类情况,大家是怎么处理的 >> >> >> >> >> >> -- >> Sent from: http://apache-flink.147419.n8.nabble.com/ |
In reply to this post by 夜思流年梦
那这样的话,用inner join是不是可以,保证订单表中的员工都在员工维表里,就能统计到所有员工在今天产生的所有订单量。
------- 夜思流年梦 wrote > 是这样子的,比如要统计所有员工的今天的订单数量,如果是订单表left join 员工表的话,那么今天没有订单数量的就无法出现在结果表集合中; > 把员工表放在左边left join 订单表的话那么就是所有员工的今天订单数量都会 出现 > > > > > > 在 2020-10-12 15:17:07,"caozhen" < > caozhen1937@ > > 写道: >> >>我理解这个场景下 员工维表在右边没啥问题。 >> >>join过程中需要去员工维表拿哪些字段? >> >> >> >>夜思流年梦 wrote >>> 现在有一个场景: 一个员工维表,一个订单表(监听mysql binlog的一个流表),想实时计算出所有员工的订单数; >>> 目前flink-sql 支持Join Temporal Tables ,但是官方文档上是这么说的:仅支持带有处理时间的 temporal >>> tables 的 inner 和 left join。 >>> 而这个场景必须是维表在左边,但实际情况是维表在左边无法进行left join :会报错:ClassCastException: >>> org.apache.calcite.rel.logical.LogicalProject cannot be cast to >>> org.apache.calcite.rel.core.TableScan;(如果是流表在左边,然后用temporal join >>> 一个维表那么没有问题,即:left join 维表 FOR SYSTEM_TIME AS OF proctime) >>> 想问下各位,碰到这类情况,大家是怎么处理的 >> >> >> >> >> >>-- >>Sent from: http://apache-flink.147419.n8.nabble.com/ -- Sent from: http://apache-flink.147419.n8.nabble.com/ |
Free forum by Nabble | Edit this page |