2020-08-26

                             Flink Sql

1.Create语句:
从Kafka源 建表
CREATE TABLE kafkaTable ( user_id BIGINT, item_id BIGINT, category_id BIGINT, behavior STRING, ts TIMESTAMP(3) ) WITH ( ‘connector’ = ‘kafka’, ‘topic’ = ‘user_behavior’, ‘properties.bootstrap.servers’ = ‘localhost:9092’, ‘properties.group.id’ = ‘testGroup’, ‘format’ = ‘csv’, ‘scan.startup.mode’ = ‘earliest-offset’ )
Options

Flink ddl 语法都是 “create table 表名( 字段属性 ) with(配置属性);” 的格式,下面的jdbc 源的建表语句也类似, flink支持的文件格式有csv,avro,json,parquet等 ;源包括kafka,es,filesystem,hdfs,
hbase,datagen,blackhole等等

JDBC源 建表:
CREATE TABLE MyUserTable ( id BIGINT, name STRING, age INT, status BOOLEAN, PRIMARY KEY (id) NOT ENFORCED ) WITH ( ‘connector’ = ‘jdbc’, ‘url’ = ‘jdbc:mysql://localhost:3306/mydatabase’, ‘table-name’ = ‘users’ );

配置选项:

2.Select语句:
Flink 的流表查询语句:(主要介绍与其他SQL不一样的点)
关于窗口:
根据窗口数据划分的不同,目前 Apache Flink 有如下 3 种 Bounded Window:
Tumble,滚动窗口,窗口数据有固定的大小,窗口数据无叠加;
Hop,滑动窗口,窗口数据有固定大小,并且有固定的窗口重建频率,窗口数据有叠加;
Session,会话窗口,窗口数据没有固定的大小,根据窗口数据活跃程度划分窗口,窗口数据无叠加。
Tumble Window
Tumble 滚动窗口有固定大小,窗口数据不重叠,具体语义如下:

Tumble 滚动窗口对应的语法如下:
SELECT
[gk],
[TUMBLE_START(timeCol, size)],
[TUMBLE_END(timeCol, size)],
agg1(col1),

aggn(colN)
FROM Tab1
GROUP BY [gk], TUMBLE(timeCol, size)
其中:
[gk] 决定了是否需要按照字段进行聚合;TUMBLE_START 代表窗口开始时间;TUMBLE_END 代表窗口结束时间;
timeCol 是流表中表示时间字段;size 表示窗口的大小,如 秒、分钟、小时、天。
举个例子,假如我们要计算每个人每天的订单量,按照 user 进行聚合分组:
SELECT user, TUMBLE_START(rowtime, INTERVAL ‘1’ DAY) as wStart, SUM(amount) FROM Orders GROUP BY TUMBLE(rowtime, INTERVAL ‘1’ DAY), user;
Hop Window
Hop 滑动窗口和滚动窗口类似,窗口有固定的 size,与滚动窗口不同的是滑动窗口可以通过 slide 参数控制滑动窗口的新建频率。因此当 slide 值小于窗口 size 的值的时候多个滑动窗口会重叠,具体语义如下:

Hop 滑动窗口对应语法如下:
SELECT
[gk],
[HOP_START(timeCol, slide, size)] ,
[HOP_END(timeCol, slide, size)],
agg1(col1),

aggN(colN)
FROM Tab1
GROUP BY [gk], HOP(timeCol, slide, size)
每次字段的意思和 Tumble 窗口类似:
[gk] 决定了是否需要按照字段进行聚合;HOP_START 表示窗口开始时间;HOP_END 表示窗口结束时间;
timeCol 表示流表中表示时间字段;slide 表示每次窗口滑动的大小;size 表示整个窗口的大小,如 秒、分钟、小时、天。
举例说明,我们要每过一小时计算一次过去 24 小时内每个商品的销量:
SELECT product, SUM(amount) FROM Orders GROUP BY HOP(rowtime, INTERVAL ‘1’ HOUR, INTERVAL ‘1’ DAY), product

Session Window
会话时间窗口没有固定的持续时间,但它们的界限由 interval 不活动时间定义,即如果在定义的间隙期间没有出现事件,则会话窗口关闭。

Seeeion 会话窗口对应语法如下:
SELECT
[gk],
SESSION_START(timeCol, gap) AS winStart,
SESSION_END(timeCol, gap) AS winEnd,
agg1(col1),

aggn(colN)
FROM Tab1
GROUP BY [gk], SESSION(timeCol, gap)
[gk] 决定了是否需要按照字段进行聚合;SESSION_START 表示窗口开始时间;SESSION_END 表示窗口结束时间;
timeCol 表示流表中表示时间字段;gap 表示窗口数据非活跃周期的时长。
例如,我们需要计算每个用户访问时间 12 小时内的订单量:
SELECT user, SESSION_START(rowtime, INTERVAL ‘12’ HOUR) AS sStart, SESSION_ROWTIME(rowtime, INTERVAL ‘12’ HOUR) AS sEnd, SUM(amount) FROM Orders GROUP BY SESSION(rowtime, INTERVAL ‘12’ HOUR), user
其他要注意的点:

Intersect / Except : 前者取交集 ,后者取差集
SELECT *FROM (
(SELECT user FROM Orders WHERE a % 2 = 0)
INTERSECT
(SELECT user FROM Orders WHERE b = 0))
SELECT *FROM (
(SELECT user FROM Orders WHERE a % 2 = 0)
EXCEPT
(SELECT user FROM Orders WHERE b = 0))
Top-N: 目前仅 Blink 计划器支持 Top-N
SELECT [column_list]FROM (
SELECT [column_list],
ROW_NUMBER() OVER ([PARTITION BY col1[, col2…]]
ORDER BY col1 [asc|desc][, col2 [asc|desc]…]) AS rownum
FROM table_name)WHERE rownum <= N [AND conditions]
ROW_NUMBER(): 根据当前分区内的各行的顺序从第一行开始,依次为每一行分配一个唯一且连续的号码。目前,我们只支持 ROW_NUMBER 在 over 窗口函数中使用。未来将会持 RANK() 和 DENSE_RANK()函数。
PARTITION BY col1[, col2…]: 指定分区列,每个分区都将会有一个 Top-N 结果。
ORDER BY col1 [asc|desc][, col2 [asc|desc]…]: 指定排序列,不同列的排序方向可以不一样。
WHERE rownum <= N: Flink 需要 rownum <= N 才能识别一个查询是否为 Top-N 查询。 其中, N代表最大或最小的 N 条记录会被保留。
[AND conditions]: 在 where 语句中,可以随意添加其他的查询条件,但其他条件只允许通过 AND 与 rownum <= N 结合使用。

3.Drop语句:
Flink SQL 目前支持以下 DROP 语句:
DROP TABLE …; DROP DATABASE …; DROP VIEW …; DROP FUNCTION …
DROP TABLE [IF EXISTS] [catalog_name.][db_name.]table_name
DROP DATABASE [IF EXISTS] [catalog_name.]db_name [ (RESTRICT | CASCADE) ]
RESTRICT
当删除一个非空数据库时,会触发异常。(默认为开)
CASCADE
删除一个非空数据库时,把相关联的表与函数一并删除。

DROP [TEMPORARY] VIEW [IF EXISTS] [catalog_name.][db_name.]view_name
DROP [TEMPORARY|TEMPORARY SYSTEM] FUNCTION [IF EXISTS] [catalog_name.][db_name.]function_name;

4.Alter语句:
Flink SQL> CREATE TABLE Orders (user BIGINT, product STRING, amount INT) WITH (…);[INFO] Table has been created.
Flink SQL> SHOW TABLES;
Orders
Flink SQL> ALTER TABLE Orders RENAME TO NewOrders;
[INFO] Table has been removed.
Flink SQL> SHOW TABLES;
NewOrders
改变table 的配置
ALTER TABLE [catalog_name.][db_name.]table_name SET (key1=val1, key2=val2, …)
改变database 的配置
ALTER DATABASE [catalog_name.]db_name SET (key1=val1, key2=val2, …)
修改一个有 catalog 和数据库命名空间的 catalog function ,需要指定一个新的 identifier ,可指定 language tag 。若函数不存在,删除会抛出异常.
改变函数
ALTER [TEMPORARY|TEMPORARY SYSTEM] FUNCTION
[IF EXISTS] [catalog_name.][db_name.]function_name
AS identifier [LANGUAGE JAVA|SCALA|PYTHON]
TEMPORARY
修改一个有 catalog 和数据库命名空间的临时 catalog function ,并覆盖原有的 catalog function 。
TEMPORARY SYSTEM
修改一个没有数据库命名空间的临时系统 catalog function ,并覆盖系统内置的函数
LANGUAGE JAVA|SCALA|PYTHON
Language tag 用于指定 Flink runtime 如何执行这个函数。目前,只支持 JAVA,SCALA 和 PYTHON,且函数的默认语言为 JAVA

5.Insert语句: <<<< Importment
INSERT { INTO | OVERWRITE } [catalog_name.][db_name.]table_name [PARTITION part_spec] select_statement
part_spec:
(part_col_name1=val1 [, part_col_name2=val2, …])
Flink建分区表,特别注意与hivesql的建表区别, hive的分区字段与建表字段不重复…
CREATE TABLE country_page_view (user STRING, cnt INT, date STRING, country STRING)PARTITIONED BY (date, country) WITH (…)
Insert into语句与hive一样
INSERT INTO country_page_view PARTITION (date=‘2019-8-30’, country=‘China’)
SELECT user, cnt FROM page_view_source;
插入单个的值, hive要开启事务,创建桶表,压缩格式orc 才支持单值插入
INSERT INTO students
VALUES (‘fred flintstone’, 35, 1.28), (‘barney rubble’, 32, 2.32);

Insert overwrite注意与hivesql的区别: hive 是 insert overwrite table …
INSERT OVERWRITE country_page_view PARTITION (date=‘2019-8-30’, country=‘China’) SELECT user, cnt FROM page_view_source;

6.SQL暗示:
可以在查询的时候做一些shuffle的配置,等
OPTIONS
eg1:
select * from
kafka_table1 /*+ OPTIONS(‘scan.startup.mode’=‘earliest-offset’) / t1
join
kafka_table2 /
+ OPTIONS(‘scan.startup.mode’=‘earliest-offset’) / t2
on t1.id = t2.id;
eg2:
insert into kafka_table1 /
+ OPTIONS(‘sink.partitioner’=‘round-robin’) */ select * from kafka_table2;

描述语句:
DESCRIBE [catalog_name.][db_name.]table_name
Flink SQL> DESCRIBE Orders;

SHOW 和 USE 与其他sql 一致.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值