在flink中我们还会涉及到经常插入数据的操作,在flink中我们使用insert的场景有如下2种情况:
1、使用select把数据插入到对应的表中。 2、直接insert数据到对应的表中。
前置:对应使用insert函数把数据插入到表中的话,我们会接触到如下几种情况:
1、插入数据的时候是否需要覆盖原来表/分区的数据。 2、插入的时候是整表插入还是只插入到某个分区里面去。
对于这两种情况我们会在下面的案例里面介绍。下面我们分别介绍下这两种场景。
使用 insert select的方式进行插入
这种使用方式的基础语法如下:
insert into table/view [PARTITION(xxx=xxxx)] select xxxx from xxxx;
示例sql如下:
- 创建一个分区表 CREATE TABLE country_page_view (user STRING, cnt INT, date STRING, country STRING) PARTITIONED BY (date, country) WITH (...) -- 追加行到该静态分区中 (date='2019-8-30', country='China') INSERT INTO country_page_view PARTITION (date='2019-8-30', country='China') SELECT user, cnt FROM page_view_source; -- Insert语句的开头可以额外增加EXECUTE关键字,带EXECUTE关键字和不带是等价的 EXECUTE INSERT INTO country_page_view PARTITION (date='2019-8-30', country='China') SELECT user, cnt FROM page_view_source; -- 追加行到分区 (date, country) 中,其中 date 是静态分区 '2019-8-30';country 是动态分区,其值由每一行动态决定 INSERT INTO country_page_view PARTITION (date='2019-8-30') SELECT user, cnt, country FROM page_view_source; -- 覆盖行到静态分区 (date='2019-8-30', country='China') INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30', country='China') SELECT user, cnt FROM page_view_source; -- 覆盖行到分区 (date, country) 中,其中 date 是静态分区 '2019-8-30';country 是动态分区,其值由每一行动态决定 INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30') SELECT user, cnt, country FROM page_view_source;
直接insert
这种方式就是我们常用的mysql的语法,需要我们在每一条insert后面补充需要插入的数据,整个语法如下:
INSERT { INTO | OVERWRITE } [catalog_name.][db_name.]table_name VALUES values_row [, values_row ...]
示例sql如下:
INSERT INTO students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
补充说明:
1、在flink sql中,我们还可以吧数据同时插入多张表中,此时的话,我们其实可以看作是执行一串事务而已,因为基础语法如下:
EXECUTE STATEMENT SET BEGIN insert_statement; ... insert_statement; END;
可以看到这里有begin和end,所以我们可以把他看作是执行一串事务,但是他真实的情况是没有事务的,插入多表的示例sql如下:
EXECUTE STATEMENT SET BEGIN INSERT INTO students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32); INSERT INTO students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32); END;
还没有评论,来说两句吧...