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

相关推荐
IvanCodes1 小时前
六、Hive 分桶
大数据·hive
依年南台1 小时前
Spark处理过程-转换算子和行动算子
大数据·ajax·spark
中电金信1 小时前
重构金融数智化产业版图:中电金信“链主”之道
大数据·人工智能
七七-d1 小时前
配置Hadoop集群-上传文件
大数据·hadoop·eclipse
Asus.Blogs3 小时前
为什么 import _ “github.com/go-sql-driver/mysql“ 要导入但不使用?_ 是什么意思?
sql·golang·github
心仪悦悦3 小时前
Spark缓存
大数据·缓存·spark
lix的小鱼3 小时前
安装Hadoop并运行WordCount程序
大数据·linux·hadoop
七七-d4 小时前
测试集群的功能-执行wordcount程序
大数据
INFINI Labs4 小时前
INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行
大数据·elasticsearch·搜索引擎·console
猪猪果泡酒5 小时前
Spark,RDD中的行动算子
大数据·分布式·spark