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 实例。
创建 Flink 表并将其注册到 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 注册表。