Flink Table API 编程入门实践


前言

Apache Flink 是目前大数据实时计算领域的明星产品,Flink Table API 则为开发者提供了声明式、类似 SQL 的数据处理能力,兼具 SQL 的易用性与编程 API 的灵活性。本文将带你快速了解 Flink Table API 的基本用法,并通过代码示例帮助你快速上手。


一、环境准备

在 Flink 中,所有 Table API 操作都需要基于 TableEnvironment。对于流处理场景,我们一般这样创建环境:

java 复制代码
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings settings = EnvironmentSettings.newInstance().inStreamingMode().build();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings);

二、数据源定义

Table API 支持多种数据源。最常见的两种方式为:

1. 从 DataStream 创建 Table

java 复制代码
DataStream<MyPojo> dataStream = env.fromElements(
    new MyPojo("Alice", 12),
    new MyPojo("Bob", 10)
);
Table table = tableEnv.fromDataStream(dataStream);

2. 从外部系统注册 Table

比如从 Kafka 注册一张表:

java 复制代码
tableEnv.executeSql(
    "CREATE TABLE user_orders (" +
    " user_id STRING, " +
    " order_amount DOUBLE " +
    ") WITH (" +
    " 'connector' = 'kafka', " +
    " 'topic' = 'orders', " +
    " 'properties.bootstrap.servers' = 'localhost:9092', " +
    " 'format' = 'json'" +
    ")"
);

三、Table API 常见操作

Table API 提供了丰富的数据处理能力,如筛选、聚合、分组、连接等。例如:

java 复制代码
import static org.apache.flink.table.api.Expressions.$;

// 筛选和选择字段
Table result = table
    .filter($("age").isGreater(10))
    .select($("name"), $("age"));

// 分组聚合
Table agg = table
    .groupBy($("name"))
    .select($("name"), $("age").avg().as("avg_age"));

四、结果输出

将 Table 转换为 DataStream,方便后续处理或输出:

java 复制代码
DataStream<Row> resultStream = tableEnv.toDataStream(result);
resultStream.print();

五、与 SQL API 结合

Table API 与 SQL API 可以无缝结合。例如:

java 复制代码
Table sqlResult = tableEnv.sqlQuery(
    "SELECT name, AVG(age) as avg_age FROM my_table GROUP BY name"
);

六、完整示例

下面是一个完整的 Flink Table API 示例,演示数据流到 Table 的转换、聚合与结果输出:

java 复制代码
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.*;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;

import static org.apache.flink.table.api.Expressions.$;

public class TableApiDemo {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        // 创建数据流
        DataStream<MyPojo> dataStream = env.fromElements(
            new MyPojo("Alice", 12),
            new MyPojo("Bob", 10),
            new MyPojo("Alice", 15)
        );

        // 转换为 Table
        Table table = tableEnv.fromDataStream(dataStream);

        // Table API 查询
        Table result = table
            .groupBy($("name"))
            .select($("name"), $("age").avg().as("avg_age"));

        // 输出结果
        DataStream<Row> resultStream = tableEnv.toDataStream(result);
        resultStream.print();

        env.execute();
    }

    public static class MyPojo {
        public String name;
        public Integer age;
        public MyPojo() {}
        public MyPojo(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    }
}

七、常见问题与建议

  • 字段名区分大小写,需与数据结构一致。
  • Table API 与 SQL API 可混用,灵活应对不同场景。
  • 生产环境推荐结合 Catalog 管理元数据。
  • Flink 1.14 以后批流统一,建议优先采用流模式开发。

结语

Flink Table API 极大地提升了大数据实时处理的开发效率,结合 SQL 的易用性和 API 的灵活性,非常适合复杂业务场景的数据处理。希望本文能帮你快速入门 Flink Table API,后续还可以深入了解窗口聚合、UDF、自定义 Connector 等高级特性。

如果你在学习和实践中遇到问题,欢迎留言交流!

相关推荐
说私域31 分钟前
短视频私域流量池的变现路径创新:基于AI智能名片链动2+1模式S2B2C商城小程序的实践研究
大数据·人工智能·小程序
MM_MS44 分钟前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
焦耳热科技前沿2 小时前
中科大EMA:3秒焦耳热一步合成双功能催化剂用于甲醇氧化协同高效制氢
大数据·人工智能·自动化·能源·材料工程
向量引擎小橙2 小时前
推理革命与能耗:AI大模型应用落地的“冰山成本”与破局之路
大数据·人工智能·深度学习·集成学习
一条咸鱼_SaltyFish2 小时前
[Day15] 若依框架二次开发改造记录:定制化之旅 contract-security-ruoyi
java·大数据·经验分享·分布式·微服务·架构·ai编程
TMT星球3 小时前
星动纪元携人形机器人家族亮相CES 2026,海外业务占比达50%
大数据·人工智能·机器人
chen<>3 小时前
Git原理与应用
大数据·git·elasticsearch·svn
焦耳热科技前沿3 小时前
西华大学Adv. Sci.:超高温焦耳热冲击制备拓扑缺陷碳,用于催化碳纳米管可控生长
大数据·人工智能·能源·材料工程·电池
故乡de云4 小时前
Google Cloud与AWS大数据AI服务对比:2026年企业选型指南
大数据·人工智能·aws
米粒14 小时前
操作系统原理--处理机调度
大数据