详解 Flink Table API 和 Flink SQL 之表和 DataStream 的转换

一、表转换为 DataStream

java 复制代码
/**
	Table API 中表到 DataStream 有两种模式:
	1.追加模式(Append Mode):用于表只会被插入(Insert)操作更改的场景。
	2.撤回模式(Retract Mode):用于任何场景。有些类似于更新模式中 Retract 模式,它只有 Insert 和 Delete 两类操作。得到的数据会增加一个 Boolean 类型的标识位(返回的第一个字段),用它来表示到底是新增的数据(Insert),还是被删除的数据(老数据,Delete)
*/
public class TableTransformDataStream {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        
        //注册表
        tableEnv.connect(new FileSystem().path("./sensor.txt"))
            .withFormat(new Csv())
            .withSchema(new Schema()
                        .field("id", DataTypes.STRING())
                        .field("timestamp", DataTypes.BIGINT())
                        .field("temperature", DataTypes.DOUBLE()))
            .createTemporaryTable("sensor");
        
        //获取表
        Table sensorTable = tableEnv.from("sensor");
        
        //简单查询
        Table resultTable = sensorTable.select("id, temperature").where("id = 'sensor_1'");
        
        //聚合查询统计
        Table aggTable = sensorTable.groupBy("id").select("id, id.count as cnt, temperature.avg as avgTemp");
        
        DataStream<Row> resultStream = tableEnv.toAppendStream(resultTable, Row.class);

        DataStream<Tuple2<Boolean, Row>> aggStream = tableEnv.toRetractStream(aggTable, Row.class);

        resultStream.print("result");
        aggStream.print("agg");
        
        env.execute();
    }
}

二、DataStream 转换为表

java 复制代码
public class DataStreamTransformTable {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        
        DataStream<String> inputStream = env.readTextFile("./sensor.txt");
        DataStream<SensorReading> dataStream = inputStream.map(line -> {
            String[] fields = line.split(",");
            return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));
        });
        
        //使用 fromDataStream 将 DataStream 转换为表
        Table table = tableEnv.fromDataStream(dataStream);
        //Table table = tableEnv.fromDataStream(dataStream, "id, timestamp as ts, temperature");
        
        env.execute();
    }
}

三、查看执行计划

java 复制代码
/**
    Table API 提供了一种机制来解释(Explain)计算表的逻辑和优化查询计划。这是通过TableEnvironment.explain(table)方法或 TableEnvironment.explain() 方法完成的。
    explain 方法会返回一个字符串,描述三个计划:
        1.未优化的逻辑查询计划
        2.优化后的逻辑查询计划
        3.实际执行计划
*/
String explaination = tableEnv.explain(resultTable);
System.out.println(explaination);
相关推荐
hqxstudying7 分钟前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·16 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
大数据CLUB33 分钟前
基于spark的奥运会奖牌变化数据分析
大数据·hadoop·数据分析·spark
Edingbrugh.南空43 分钟前
Hadoop高可用集群搭建
大数据·hadoop·分布式
智慧化智能化数字化方案1 小时前
69页全面预算管理体系的框架与落地【附全文阅读】
大数据·人工智能·全面预算管理·智慧财务·智慧预算
Bug退退退1231 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠1 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
武子康1 小时前
大数据-33 HBase 整体架构 HMaster HRegion
大数据·后端·hbase
Zz_waiting.2 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥2 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端