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

1. TableEnvironment

创建 TableEnvironment

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 表

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 表

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 它们。

通过列表类型的对象创建

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

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 中执行作业时,你需要等待作业执行完成。

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 中创建表。

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

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

猜你喜欢

转载自blog.csdn.net/victory0508/article/details/132357940