Flink流批一体计算(13):PyFlink Tabel API之SQL DDL

1. TableEnvironment

创建 TableEnvironment

python 复制代码
from pyflink.table import Environmentsettings, TableEnvironment


# create a streaming TableEnvironment

env_settings = Environmentsettings.in_streaming_mode()

table_env = TableEnvironment.create(env_settings)

# or create a batch TableEnvironment

env_settings = Environmentsettings.in_batch_mode()

table_env = TableEnvironment.create(env_settings)

TableEnvironment 是 Table API 和 SQL 集成的核心概念。

TableEnvironment 可以用来:

  • ·创建 Table
  • ·将 Table 注册成临时表
  • ·执行 SQL 查询
  • ·注册用户自定义的 (标量,表值,或者聚合) 函数
  • ·配置作业
  • ·管理 Python 依赖
  • ·提交作业执行

创建 source 表

python 复制代码
table_env.execute_sql("""

    CREATE TABLE datagen (

        id INT,

        data STRING

    ) WITH (

        'connector' = 'datagen',

        'fields.id.kind' = 'sequence',

        'fields.id.start' = '1',

        'fields.id.end' = '10'

    )

""")

创建 sink 表

python 复制代码
table_env.execute_sql("""

    CREATE TABLE print (

        id INT,

        data STRING

    ) WITH (

        'connector' = 'print'

    )

""")

2. Table

Table 是 Python Table API 的核心组件。Table 是 Table API 作业中间结果的逻辑表示。

一个 Table 实例总是与一个特定的 TableEnvironment 相绑定。

不支持在同一个查询中合并来自不同 TableEnvironments 的表,例如 join 或者 union 它们。

通过列表类型的对象创建

你可以使用一个列表对象创建一张表:

python 复制代码
from pyflink.table import Environmentsettings, TableEnvironment

# 创建 批 TableEnvironment

env_settings = Environmentsettings.in_batch_mode()

table_env = TableEnvironment.create(env_settings)

table = table_env.from_elements([(1, 'Hi'), (2, 'Hello')])

table.to_pandas()==>print(table.to_pandas())

table = table_env.from_elements([(1, 'Hi'), (2, 'Hello')], ['id', 'data'])

print(table.to_pandas())

通过 DDL 创建

你可以通过 DDL 创建一张表,execute_sql(stmt) 执行指定的语句并返回执行结果。

执行语句可以是 DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE。

注意,对于 "INSERT INTO" 语句,这是一个异步操作,通常在向远程集群提交作业时才需要使用。

但是,如果在本地集群或者 IDE 中执行作业时,你需要等待作业执行完成。

python 复制代码
from pyflink.table import Environmentsettings, TableEnvironment

# 创建流 TableEnvironment

env_settings = Environmentsettings.in_streaming_mode()

table_env = TableEnvironment.create(env_settings)

table_env.execute_sql("""

    CREATE TABLE random_source (

        id BIGINT,

        data TINYINT

    ) WITH (

        'connector' = 'datagen',

        'fields.id.kind'='sequence',

        'fields.id.start'='1',

        'fields.id.end'='3',

        'fields.data.kind'='sequence',

        'fields.data.start'='4',

        'fields.data.end'='6'

    )

""")

table = table_env.from_path("random_source")

table.to_pandas()

通过 Catalog 创建

Catalog

Catalog提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。

数据处理最关键的方面之一是管理元数据。

元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。

元数据也可以是持久化的,例如 Hive Metastore 中的元数据。

Catalog 提供了一个统一的API,用于管理元数据,并使其可以从 Table API 和 SQL 查询语句中来访问。

Catalog类型

|------------------------|---------------------------------------------------------------------------------------|
| GenericInMemoryCatalog | 基于内存实现的 Catalog,所有元数据只在 session 的生命周期内可用。 |
| JdbcCatalog | JdbcCatalog使得用户可以将 Flink 通过 JDBC 协议连接到关系数据库。 PostgresCatalog 是当前实现的唯一一种 JDBC Catalog。 |
| HiveCatalog | HiveCatalog 有两个用途:作为原生 Flink 元数据的持久化存储,以及作为读写现有 Hive 元数据的接口。 |

警告 Hive Metastore 以小写形式存储所有元数据对象名称,GenericInMemoryCatalog 区分大小写。

用户自定义 Catalog

Catalog 是可扩展的,用户可以通过实现 Catalog 接口来开发自定义 Catalog。

想要在 SQL CLI 中使用自定义 Catalog,用户除了需要实现自定义的 Catalog 之外,还需要为这个 Catalog 实现对应的 CatalogFactory 接口。

CatalogFactory 定义了一组属性,用于 SQL CLI 启动时配置 Catalog。

这组属性集将传递给发现服务,在该服务中,服务会尝试将属性关联到 CatalogFactory 并初始化相应的 Catalog 实例。

使用 SQL DDL

用户可以使用 DDL 通过 Table API 或者 SQL Client 在 Catalog 中创建表。

python 复制代码
from pyflink.table.catalog import HiveCatalog

# Create a HiveCatalog

catalog = HiveCatalog("myhive", None, "<path_of_hive_conf>")

# Register the catalog

t_env.register_catalog("myhive", catalog)

# Create a catalog database

t_env.execute_sql("CREATE DATABASE mydb WITH (...)")

# Create a catalog table

t_env.execute_sql("CREATE TABLE mytable (name STRING, age INT) WITH (...)")

# should return the tables in current catalog and database.

t_env.list_tables()

通过 SQL DDL 创建的表和视图, 例如 "create table ..." 和 "create view ...",都存储在 catalog 中。

你可以通过 SQL 直接访问 catalog 中的表。

使用 Java/Scala

用户可以用编程的方式使用Java 或者 Scala 来创建 Catalog 表。

python 复制代码
from pyflink.table import *
from pyflink.table.catalog import HiveCatalog, CatalogDatabase, ObjectPath, CatalogBaseTable
from pyflink.table.descriptors import Kafka
settings = Environmentsettings.in_batch_mode()
t_env = TableEnvironment.create(settings)
# Create a HiveCatalog
catalog = HiveCatalog("myhive", None, "<path_of_hive_conf>")
# Register the catalog
t_env.register_catalog("myhive", catalog)
# Create a catalog database
database = CatalogDatabase.create_instance({"k1": "v1"}, None)
catalog.create_database("mydb", database)
# Create a catalog table
schema = Schema.new_builder() \
    .column("name", DataTypes.STRING()) \
    .column("age", DataTypes.INT()) \
    .build()  
catalog_table = t_env.create_table("myhive.mydb.mytable", TableDescriptor.for_connector("kafka")
    .schema(schema)
    // ...
    .build())
# tables should contain "mytable"
tables = catalog.list_tables("mydb")

TableEnvironment 维护了一个使用标识符创建的表的 catalogs 映射。

Catalog 中的表既可以是临时的,并与单个 Flink 会话生命周期相关联,也可以是永久的,跨多个 Flink 会话可见。

如果你要用 Table API 来使用 catalog 中的表,可以使用 "from_path" 方法来创建 Table API 对象:

from_path(path) 通过指定路径下已注册的表来创建一个表,例如通过 create_temporary_view 注册表。

相关推荐
WordPress学习笔记29 分钟前
镌刻中式美学的高端WordPress主题
大数据·人工智能·wordpress
数智化精益手记局2 小时前
拆解物料管理erp系统的核心功能,看物料管理erp系统如何解决库存积压与缺料难题
大数据·网络·人工智能·安全·信息可视化·精益工程
Elastic 中国社区官方博客3 小时前
使用 Observability Migration Platform 将 Datadog 和 Grafana 的仪表板与告警迁移到 Kibana
大数据·elasticsearch·搜索引擎·信息可视化·全文检索·grafana·datalog
jkyy20144 小时前
AI运动数字化:以技术重塑场景,健康有益赋能全域运动健康管理
大数据·人工智能·健康医疗
金融小师妹4 小时前
4月30日多因子共振节点:鲍威尔“收官效应”与权力结构重塑的预期重构
大数据·人工智能·重构·逻辑回归
2601_949925184 小时前
AI Agent如何重构跨境物流的决策?
大数据·人工智能·重构·ai agent·geo优化·物流科技
xiaoduo AI4 小时前
客服机器人问题解决率怎么统计?Agent系统自动判断是否解决,比人工回访准?
大数据·人工智能·机器人
猫的玖月5 小时前
(一)MY SQL概述
数据库·sql
小五兄弟5 小时前
YouTube 肖像检测扩展背后:短剧出海版权保护的技术实现与实战策略
大数据·人工智能
阿瑞说项目管理6 小时前
2026 实战入门指南:企业 Agent 到底能解决哪些工作问题?
大数据·人工智能·agent·智能体·企业级ai