You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by 夜思流年梦 <li...@163.com> on 2020/10/12 03:55:50 UTC
关于flink-sql Join Temporal Tables join 维表问题
现在有一个场景: 一个员工维表,一个订单表(监听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)
想问下各位,碰到这类情况,大家是怎么处理的
Re:Re: 关于flink-sql Join Temporal Tables join 维表问题
Posted by 夜思流年梦 <li...@163.com>.
你好,我最开始也考虑用双流join,但是双流join 就会碰到一个问题,就是结果集只会包含今天有订单的员工数据,那么没有订单的员工数据是不会体现到结果集的。主要是需要所有员工今天的订单数量;
在 2020-10-12 15:37:51,"Jark Wu" <im...@gmail.com> 写道:
>我理解楼主的场景不是 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 <ca...@163.com> 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/
Re: 关于flink-sql Join Temporal Tables join 维表问题
Posted by Jark Wu <im...@gmail.com>.
我理解楼主的场景不是 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 <ca...@163.com> 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/
Re: Re:Re: 关于flink-sql Join Temporal Tables join 维表问题
Posted by caozhen <ca...@163.com>.
那这样的话,用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/
Re:Re: 关于flink-sql Join Temporal Tables join 维表问题
Posted by 夜思流年梦 <li...@163.com>.
是这样子的,比如要统计所有员工的今天的订单数量,如果是订单表left join 员工表的话,那么今天没有订单数量的就无法出现在结果表集合中;
把员工表放在左边left join 订单表的话那么就是所有员工的今天订单数量都会 出现
在 2020-10-12 15:17:07,"caozhen" <ca...@163.com> 写道:
>
>我理解这个场景下 员工维表在右边没啥问题。
>
>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/
Re: 关于flink-sql Join Temporal Tables join 维表问题
Posted by caozhen <ca...@163.com>.
我理解这个场景下 员工维表在右边没啥问题。
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/