详解 Flink Table API 和 Flink SQL 之表操作

一、表环境配置

/**
	表环境的主要功能:
		1.注册 Catalog 和表
		2.执行 SQL 查询
		3.注册用户自定义函数(UDF)
		4.DataStream 和表之间的转换
*/
public class TestTableEnvironment {
   
    public static void main(String[] args) throws Exception {
   
        //1.配置老版本 planner 的流式处理表环境
        StreamTableEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        
        EnvironmentSettings oldStreamSettings = EnvironmentSettings.newInstance()
            .useOldPlanner()
            .inStreamingMode()
            .build();
        
		StreamTableEnvironment oldStreamTableEnv = StreamTableEnvironment.create(env, oldStreamSettings);
        
        //2.配置老版本 planner 的批处理表环境
        ExecutionEnvironment batchEnv = ExecutionEnvironment.getExecutionEnvironment();
		BatchTableEnvironment oldBatchTableEnv = BatchTableEnvironment.create(batchEnv);
        
        //3.配置 blink planner 的流式处理表环境
        EnvironmentSettings blinkStreamSettings = EnvironmentSettings.newInstance()
            .useBlinkPlanner()
            .inStreamingMode()
            .build();
        
		StreamTableEnvironment blinkStreamTableEnv = StreamTableEnvironment.create(env, blinkStreamSettings);
        
        //4.配置 blink planner 的批处理表环境
		EnvironmentSettings blinkBatchSettings = EnvironmentSettings.newInstance()
            .useBlinkPlanner()
            .inBatchMode()
            .build();
        
		TableEnvironment blinkBatchTableEnv = TableEnvironment.create(blinkBatchSettings);
        
    }
}

二、创建表

1. 表的概念

  • Flink 中的表概念是指由多个“行”数据构成的,每个行(Row)可以有定义好的多个列(Column)字段的固定类型的数据组成的二维矩阵
  • 表环境可以注册目录 Catalog,并可以基于 Catalog 注册表,会维护一个 Catalog-Table 表之间的 map。表在表环境中有一个唯一的 ID 标识符,由目录(catalog)名,数据库(database)名以及表名三部分组成。在默认情况下,目录名为 default_catalog,数据库名为 default_database,因此直接创建一个表 MyTable 则它的 ID 为 default_catalog.default_database.MyTable
  • 表可以是常规的(Table,表),或者虚拟的(View,视图) 。常规表(Table)一般可以用来描述外部数据,比如文件、数据库表或消息队列的数据,也可以直接从 DataStream 转换而来。视图可以从现有的表中创建,通常是 table API 或者 SQL 查询的一个结果

2. 创建方式

2.1 连接器创建
2.1.1 连接文件系统
public class CreateTableFromFileSystem {
   
    public static void main(String[] args) throws Exception {
   
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        
        //从文件系统读取数据创建表
        String filePath = "./sensor.txt";
        tableEnv.connect(new FileSystem().path(filePath)) //ConnectorDescriptor实现类
            //.withFormat(new OldCsv()) //FormatDescriptor实现类,OldCsv为老版本CSV文件格式
            .withFormat(new Csv()) //新版本CSV格式需要引入flink-csv依赖
            .withSchema(
            	new Schema() //传入Schema类实例
            	.field("id", DataTypes.STRING()) //指定表的字段名及类型
            	.field("timestamp", DataTypes.BIGINT())
            	.field("temperature", DataTypes.DOUBLE())
             )
             .createTemporaryTable("sensorTable"); //创建临时表
        
        Table table = tableEnv.from("sensorTable");
        table.printSchema();
        
        tableEnv.toAppendStream(table, Row.class).print();
        
        env.execute();
    }
}
<dependency>
    <groupId>org.apache.flinkgroupId>
    <artifactId>flink-csvartifactId>
    <version>1.10.1version>
dependency>
2.1.2 连接 Kafka
public class CreateTableFromKafka {
   
    public static void main(String[] args) throws Exception {
   
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        
        StreamTableEnvironment tableEnv = 

你可能感兴趣的:(Flink,flink,sql,数据库,大数据,java)