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 注册表。

相关推荐
喜欢喝果茶.1 天前
SQL 预处理
数据库·sql
RoboWizard1 天前
本地AI主机批量部署 高效存储支撑全场景配置
大数据·人工智能
dingzd951 天前
产品同质化严重如何用材质升级做出溢价空间
大数据·人工智能·跨境电商·内容营销
@PHARAOH1 天前
WHAT - AI 时代下的候选人
大数据·前端·人工智能
Data-Miner1 天前
50页精品PPT | 数据安全运营体系建设方案
大数据·数据分析
麦聪聊数据1 天前
跨云与多区服游戏架构下的数据库运维:基于webSQL的访问实践
数据库·sql·低代码·游戏·restful
weixin_436182421 天前
PLC 与 DCS 国产化报告获取:工控产业情报查找指南
大数据·人工智能·国产plc
金智维科技官方1 天前
制造业如何用Ki-AgentS智能体平台实现设备巡检自动化?
大数据·运维·人工智能
志栋智能1 天前
告别高昂投入:超自动化IT运维的轻量化实践
大数据·运维·网络·人工智能·自动化
腾视科技TENSORTEC1 天前
腾视科技TS-SG-SM7系列AI算力模组:32TOPS算力引擎,开启边缘智能新纪元
大数据·人工智能·科技·ai·ai算力模组·ai模组·ainas