文档结构
官网教程:https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/
概念同步
连接数据库
Flink 本身不自带 MySQL、Oracle 等第三方数据库的驱动包,只提供通用的 JDBC 连接器。连接具体数据库时,必须手动引入对应厂商的驱动 Jar 包,否则会报 ClassNotFoundException: com.mysql.cj.jdbc.Driver 一类的错误。
SQL 语法
sql
select 'hello world!';
select current_timestamp;
# 查看可用函数
show functions;
- 时态关联
sql
SELECT o.order_id, o.total, c.country, c.zip
FROM Orders AS o -- 订单流(事实表)
inner JOIN Customers
FOR SYSTEM_TIME AS OF o.proc_time AS c
ON o.customer_id = c.id; -- 关联条件
Sql Hint
sql
-- 覆盖查询语句中源表的选项
select id, name from kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */;
sink.partitioner='round-robin'
表示轮询分发,让数据均匀写入 Kafka 所有分区,解决默认分区策略可能导致的数据倾斜问题。
- BROADCAST
python
CREATE TABLE t1 (id BIGINT, name STRING, age INT) WITH (...);
CREATE TABLE t2 (id BIGINT, name STRING, age INT) WITH (...);
CREATE TABLE t3 (id BIGINT, name STRING, age INT) WITH (...);
-- Flink 会使用 broadcast join,且表 t1 会被当作需 broadcast 的表。
SELECT /*+ BROADCAST(t1) */ * FROM t1 JOIN t2 ON t1.id = t2.id;
-- Flink 会在两个联接中都使用 broadcast join,且 t1 和 t3 会被作为需 broadcast 到下游的表。
SELECT /*+ BROADCAST(t1, t3) */ * FROM t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t1.id = t3.id;
-- BROADCAST 只支持等值的联接条件
-- 联接提示会失效,只能使用支持非等值条件联接的 nested loop join。
SELECT /*+ BROADCAST(t1) */ * FROM t1 join t2 ON t1.id > t2.id;
-- BROADCAST 不支持 `Full Outer Join`
-- 联接提示会失效,planner 会根据 cost 选择最合适的联接策略。
SELECT /*+ BROADCAST(t1) */ * FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.id;
注意: BROADCAST 只支持等值的联接条件,且不支持 Full Outer Join。
-
SHUFFLE_HASH
-
SHUFFLE_MERGE
-
NEST_LOOP
注意:NEST_LOOP 同时支持等值的和非等值的联接条件。
================================== over =============================================