Flink SQL DDL中维表Join的实现与优化
Flink SQL中如何实现维表Join(Lookup Join)?请列举支持的维表类型(JDBC/HBase/Redis),解释Lookup Cache/Batch模式的工作原理,以及如何处理延迟维表数据的更新。
回答
古法程序员
Flink SQL维表Join(Lookup Join):
- 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;
-
支持的维表:
- JDBC(MySQL/PG)
- HBase
- Redis
- Elasticsearch
- 自定义AsyncLookupFunction
-
Lookup Cache模式:
- Full Cache:启动时全量加载到TM内存,适合小维表
- LRU Cache:按需加载,
lookup.cache.max-rows控制容量 - No Cache:每条数据都查外部存储
-
Batch Lookup:批量化查询请求,减少网络IO
async.capacity控制异步请求并发数async.timeout设置超时
-
维表更新处理:
- Cache TTL过期后重新拉取
- CDC实时维表(Flink CDC + HBase作为维表)
- 使用
LOOKUPHint指定异步/同步模式