Flink流批一体计算(15):PyFlink Tabel API之SQL写入Sink

目录

举个例子

写入Sink的各种情况

[1. 将结果数据收集到客户端](#1. 将结果数据收集到客户端)

[2. 将结果数据转换为Pandas DataFrame,并收集到客户端](#2. 将结果数据转换为Pandas DataFrame,并收集到客户端)

[3. 将结果写入到一张 Sink 表中](#3. 将结果写入到一张 Sink 表中)

[4. 将结果写入多张 Sink 表中](#4. 将结果写入多张 Sink 表中)


举个例子

将计算结果写入给 sink 表

python 复制代码
#将Table API结果表数据写入sink表:
result_table.execute_insert("print").wait()
# 或者通过SQL查询语句来写入sink表:
table_env.execute_sql("INSERT INTO print SELECT * FROM datagen").wait()

写入Sink的各种情况

1. 将结果数据收集到客户端

你可以使用 TableResult.collect 将 Table 的结果收集到客户端,结果的类型为迭代器类型。

以下代码展示了如何使用 TableResult.collect() 方法:

python 复制代码
#准备source表
source = table_env.from_elements([(1, "Hi", "Hello"), (2, "Hello", "Hello")], ["a", "b", "c"])
#得到TableResult
res = table_env.execute_sql("select a + 1, b, c from %s" % source)
#遍历结果
with res.collect() as results:
   for result in results:
       print(result)

2. 将结果数据转换为Pandas DataFrame,并收集到客户端

3. 将结果写入到一张 Sink 表中

你可以调用 execute_insert 方法来将 Table 对象中的数据写入到一张 sink 表中:

python 复制代码
table_env.execute_sql("""
    CREATE TABLE sink_table (
        id BIGINT,
        data VARCHAR
    ) WITH (
        'connector' = 'print'
    )
""")
table = table_env.from_elements([(1, 'Hi'), (2, 'Hello')], ['id', 'data'])
table.execute_insert("sink_table").wait()

也可以通过 SQL 来完成

python 复制代码
table_env.create_temporary_view("table_source", table)
table_env.execute_sql("INSERT INTO sink_table SELECT * FROM table_source").wait()

4. 将结果写入多张 Sink 表中

你也可以使用 Statementset 在一个作业中将 Table 中的数据写入到多张 sink 表中:

create_statement_set() 创建一个可接受 DML 语句或表的 Statementset 实例。 它可用于执行包含多个 sink 的作业。

python 复制代码
# 准备 source 表和 sink 表
table = table_env.from_elements([(1, 'Hi'), (2, 'Hello')], ['id', 'data'])
table_env.create_temporary_view("simple_source", table)
table_env.execute_sql("""
    CREATE TABLE first_sink_table (
        id BIGINT,
        data VARCHAR
    ) WITH (
        'connector' = 'print'
    )
""")
table_env.execute_sql("""
    CREATE TABLE second_sink_table (
        id BIGINT,
        data VARCHAR
    ) WITH (
        'connector' = 'print'
    )
""")
# 创建 statement set
statement_set = table_env.create_statement_set()
# 将 "table" 的数据写入 "first_sink_table"
statement_set.add_insert("first_sink_table", table)
# 通过一条 sql 插入语句将数据从 "simple_source" 写入到 "second_sink_table"
statement_set.add_insert_sql("INSERT INTO second_sink_table SELECT * FROM simple_source")
# 执行 statement set
statement_set.execute().wait()
相关推荐
这儿有一堆花3 分钟前
JSON 与 MongoDB:直存对象的便利与隐性代价
数据库·mongodb·json
翔云 OCR API5 分钟前
API让文档信息“活”起来:通用文档识别接口-开发者文字识别API
前端·数据库·人工智能·mysql·ocr
摇滚侠5 分钟前
Redis 零基础到进阶,zset、bitmap、HyperLogLog、GEO、stream、bitfiled,笔记20-27
数据库·redis·笔记
bing.shao12 分钟前
Golang select多路复用踩坑
数据库·golang·php
摇滚侠13 分钟前
索引失效,数据库引擎,索引失效的六种情况
数据库·面试
QT 小鲜肉15 分钟前
【Linux命令大全】001.文件管理(理论篇)
linux·数据库·chrome·笔记
小年糕是糕手16 分钟前
【C++同步练习】模板初阶
服务器·开发语言·前端·javascript·数据库·c++·改行学it
morliz子轩31 分钟前
在Docker上安装MYSQL 8.x—RelationalDb with SQL
sql·mysql·docker
Sammyyyyy37 分钟前
Django 6.0 发布,新增原生任务队列与 CSP 支持
数据库·后端·python·django·sqlite·servbay
就叫飞六吧1 小时前
innodb 更新存储的索引大小以及记录数
数据库·oracle