FlinkSql的三种建表方式
FLinkSql三种建表的方式
1.基于DataSteam流来创建
注:此时先创建的一个Table对象,如果使用Table APi操作的话就可以直接操作了,如果要使用Sql的方式则需要先注册成一个view然后再操作
- 关键语句
Table tableApi = tableEnv.fromDataStream(mapDataStream);
- 举例
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
DataStreamSource<String> dataStreamSource = env.readTextFile("D:\\workspace21\\myflink\\src\\main\\resources\\sensors.txt");
DataStream<SensorReading> mapDataStream = dataStreamSource.map(el -> {
String[] split = el.split(",");
return new SensorReading(split[0], Double.valueOf(split[2]), Long.valueOf(split[1]));
});
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
Table tableApi = tableEnv.fromDataStream(mapDataStream);
//tableApi 的方式查询过滤只有sensor_2的温度数据
Table resultTableApi = tableApi.select("id,temperature")
.where("id='sensor_2'");
//SQL的方式 需要先将dataStream注册成一张表
tableEnv.createTemporaryView("sensor_table", mapDataStream);
Table resultTableSql = tableEnv.sqlQuery("select id,temperature from sensor_table where id='sensor_2'");
//打印
tableEnv.toAppendStream(resultTableApi, Row.class).print("api");
tableEnv.toAppendStream(resultTableSql, Row.class).print("sql");
env.execute();
}
2. 基于connect+withFormat+withSchema方式
注:此时是先注册成一个view,如果使用SQL操作的话就可以直接操作了,如果要使用Api的方式则需要使用from语句获得Table对象
- 关键语句
tableEnv.connect(new FileSystem().path(filePath))
//withFormat 是用来告诉flink我应该怎么处理来源用的每一条数据 比如按csv的格式,号分割
.withFormat(new Csv())
//withSchema 是声明创建表的表结构 要按照解析得到的数据的先后顺序对应
.withSchema(new Schema()
.field("id", DataTypes.STRING())
.field("time", DataTypes.BIGINT())
.field("temp", DataTypes.DOUBLE()))
.createTemporaryTable("inputTable");
- 举例
String filePath = "D:\\workspace21\\myflink\\src\\main\\resources\\sensors.txt";
tableEnv.connect(new FileSystem().path(filePath))
//withFormat 是用来告诉flink我应该怎么处理来源用的每一条数据 比如按csv的格式,号分割
.withFormat(new Csv())
//withSchema 是声明创建表的表结构 要按照解析得到的数据的先后顺序对应
.withSchema(new Schema()
.field("id", DataTypes.STRING())
.field("time", DataTypes.BIGINT())
.field("temp", DataTypes.DOUBLE()))
.createTemporaryTable("inputTable");
//2.1 使用table api 完成查询过滤和聚合操作
Table inputTable = tableEnv.from("inputTable");
Table tableApiSelect = inputTable.select("id,temp")
.filter("id='sensor_2'");
Table tableApiAgg = inputTable.groupBy("id")
.select("id,id.count as cnt,temp.avg as avgTemp");
//2.2 使用table sql 实现上面的两个查询
Table tableSqlSelect = tableEnv.sqlQuery("select id,temp from inputTable where id='sensor_2'");
Table tableSqlAgg = tableEnv.sqlQuery("select id,count(id) as cnt, avg(temp) as avgTemp from inputTable group by id");
3.基于DDL建表语句,就是Create Table方式
注:此时和方式2一样,是先注册成一个view,如果使用SQL操作的话就可以直接操作了,如果要使用Api的方式则需要使用from语句获得Table对象
- 关键
tableEnv.sqlUpdate(sinkDDL)
- 举例
String sinkDDL=
"create table jdbcOutputTable (" +
" id varchar(20) not null, " +
" cnt bigint not null " +
") with (" +
" 'connector.type' = 'jdbc', " +
" 'connector.url' = 'jdbc:mysql://localhost:3306/test', " +
" 'connector.table' = 'sensor_count', " +
" 'connector.driver' = 'com.mysql.jdbc.Driver', " +
" 'connector.username' = 'root', " +
" 'connector.password' = '123456' )";
tableEnv.sqlUpdate(sinkDDL)