FlinkSql的Join

flinkSql维表五万以内读doris和mysql的区别是什么?

    在选择Flink SQL关联全量dim维表时,是选择MySQL还是Doris,以及是使用JDBC Connector还是CDC Connector,需要基于具体的业务场景和需求进行决策。以下是对这两种数据源和连接方式的详细分析和建议:
    1 数据源
     MySQL:
     优势:
            成熟稳定:MySQL是一个广泛使用的关系型数据库,具有良好的稳定性和成熟的社区支持。
            功能丰富:提供了丰富的SQL功能和事务处理能力。
            易于集成:Flink SQL Connector支持通过JDBC与MySQL集成,方便使用。
     劣势:
            性能瓶颈:在高并发或大数据量场景下,MySQL的性能可能成为瓶颈。
            数据变更捕获:对于实时数据同步,基于查询的CDC方式可能无法满足需求。
     Doris:
     优势:
           MPP架构:Doris采用分布式MPP架构,支持高性能的OLAP查询。
           实时分析:适用于实时分析场景,提供低延迟的数据查询能力。
            数据一致性:通过数据复制和分布式事务等技术保障数据的一致性。
     劣势:
            学习成本:相对于MySQL,Doris的使用和配置可能需要更高的学习成本。
            社区支持:虽然Doris的社区在不断发展,但相对于MySQL来说,其社区规模和成熟度可能还有所欠缺。
    2 连接器
     JDBC Connector:适用于需要连接关系型数据库(如MySQL)的场景。成熟稳定,易于使用。
     CDC Connector:适用于需要实时捕获数据库变更(如新增、更新、删除)的场景。实时性,一致性,增量同步。

flinkSql 增量数据关联用户维表。举例具体比较 Temporal Joins 与 Lookup Join

在 Apache Flink SQL 中,Temporal Joins 和 Lookup Join 是两种不同的连接策略,用于将流数据与维表(或称为外部查找表)进行连接。以下将分别给出使用这两种策略进行增量数据关联用户维表的示例,并进行比较。

Temporal Joins 示例
假设我们有一个用户活动流(user_activity_stream),其中包含用户ID、活动时间和一些活动数据,以及一个用户维表(user_dimension),其中包含用户ID、用户名称和其他用户信息。

用户活动流 (user_activity_stream)

CREATE TABLE user_activity_stream (  
    user_id STRING,  
    activity_time TIMESTAMP(3),  
    activity_data STRING,  
    WATERMARK FOR activity_time AS activity_time - INTERVAL '5' SECOND  
) WITH (...);

用户维表 (user_dimension)

CREATE TABLE user_dimension (  
    user_id STRING,  
    user_name STRING,  
    user_info STRING,  
    valid_from TIMESTAMP(3),  
    valid_to TIMESTAMP(3)  
) WITH (...);

Temporal Join 查询

SELECT   
    a.user_id,   
    a.activity_time,   
    a.activity_data,   
    d.user_name,   
    d.user_info  
FROM   
    user_activity_stream AS a  
JOIN   
    user_dimension FOR SYSTEM_TIME AS OF a.activity_time AS d  
ON   
    a.user_id = d.user_id  
WHERE   
    d.valid_from <= a.activity_time AND a.activity_time < d.valid_to;

在这个例子中,Temporal Join 会根据 user_activity_stream 中的 activity_time 字段与 user_dimension 表中的有效时间范围(valid_from 和 valid_to)进行连接,以获取活动发生时的用户信息。
Lookup Join 示例
对于 Lookup Join,通常需要一个支持异步查找的连接器,如 Flink 的 JDBC Catalog Connector 或其他自定义的 Lookup Table Source。
用户活动流 (user_activity_stream) 同上。
Lookup Join 查询(假设我们有一个支持异步查找的 JDBC 连接器)

SELECT   
    a.user_id,   
    a.activity_time,   
    a.activity_data,   
    d.user_name,   
    d.user_info  
FROM   
    user_activity_stream AS a  
LEFT JOIN LATERAL TABLE(  
    jdbc('select user_name, user_info from user_dimension where user_id = ?', a.user_id)  
) AS d ON TRUE;

在这个例子中,Lookup Join 使用 LATERAL TABLE 和 JDBC 连接器来异步地从 user_dimension 表中查找与 user_activity_stream 中每个事件相关的用户信息。

比较

Temporal Joins:
基于时间属性进行连接,适用于需要获取特定时间点的维表状态的情况。
需要维表具有时间属性(如有效时间范围)以支持时态查询。
通常需要更复杂的设置和配置,因为需要处理时间属性和水印。
Lookup Joins:
基于键值对进行连接,适用于简单的基于主键的查找。
通常需要外部连接器(如 JDBC)来支持异步查找。
在某些情况下,可能不如 Temporal Joins 灵活,因为它只能获取最新的维表状态,而不能基于时间范围进行查询。
通常更容易设置和配置,因为不需要处理时间属性和水印。

选择哪种策略取决于具体的应用场景和需求。如果需要基于时间范围进行连接,或者维表数据随时间变化并且需要保留历史状态,那么 Temporal Joins 可能是一个更好的选择。如果只需要简单的基于主键的查找,并且不关心历史状态,那么 Lookup Joins 可能更合适。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独狐游清湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值