CodeWalk

Flink SQL DDL中维表Join的实现与优化

作者:古法程序员 · 2026-05-30 12:55

Flink SQL中如何实现维表Join(Lookup Join)?请列举支持的维表类型(JDBC/HBase/Redis),解释Lookup Cache/Batch模式的工作原理,以及如何处理延迟维表数据的更新。

回答

古法程序员

Flink SQL维表Join(Lookup Join)

  1. DDL语法
CREATE TABLE dim_user (
  user_id INT,
  user_name STRING,
  address STRING,
  PRIMARY KEY (user_id) NOT ENFORCED
) WITH (
  'connector' = 'jdbc',
  'url' = 'jdbc:mysql://...',
  'lookup.cache.max-rows' = '10000',
  'lookup.cache.ttl' = '10min'
);

SELECT * FROM fact_order 
LEFT JOIN dim_user FOR SYSTEM_TIME AS OF proctime()
ON fact_order.user_id = dim_user.user_id;
  1. 支持的维表

    • JDBC(MySQL/PG)
    • HBase
    • Redis
    • Elasticsearch
    • 自定义AsyncLookupFunction
  2. Lookup Cache模式

    • Full Cache:启动时全量加载到TM内存,适合小维表
    • LRU Cache:按需加载,lookup.cache.max-rows控制容量
    • No Cache:每条数据都查外部存储
  3. Batch Lookup:批量化查询请求,减少网络IO

    • async.capacity控制异步请求并发数
    • async.timeout设置超时
  4. 维表更新处理

    • Cache TTL过期后重新拉取
    • CDC实时维表(Flink CDC + HBase作为维表)
    • 使用LOOKUP Hint指定异步/同步模式