Flink SQL系列:Table API使用

欢迎关注交流微信公众号:小满锅

下面有两种API,分别是Apache社区的原生Flink API,还有一种是经过阿里优化过的一种APi,叫做Blink,两种API对于Batch和Stream有一些区别

  • 1:Blink对于“批”表会当做“流”表处理,所以“批”表和Dataset之间是不可以转换的,而DataSet回当做DataStream程序去处理,而DataStream和“流”表之间可以相互转换的。
package flinkjava.Task.TableTask;

import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.java.BatchTableEnvironment;
import org.apache.flink.table.api.java.StreamTableEnvironment;

public class task1 {
    public static void main(String[] args) {
        /****************************/
        /***  flink stream query  ***/
        /****************************/
        EnvironmentSettings fsSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build();
        StreamExecutionEnvironment fsenv = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment fsTabEnv = StreamTableEnvironment.create(fsenv,fsSettings);



        /****************************/
        /***  flink Batch  query  ***/
        /****************************/
        ExecutionEnvironment fbEnv = ExecutionEnvironment.getExecutionEnvironment();
        BatchTableEnvironment fbTableEnv = BatchTableEnvironment.create(fbEnv);


        /****************************/
        /***  blink stream query  ***/
        /****************************/
        StreamExecutionEnvironment bsEnv = StreamExecutionEnvironment.getExecutionEnvironment();
        EnvironmentSettings bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
        StreamTableEnvironment bsTableEnv = StreamTableEnvironment.create(bsEnv,bsSettings);


        /****************************/
        /***  blink Batch  query  ***/
        /****************************/
        EnvironmentSettings bbSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inBatchMode().build();
        TableEnvironment bbTableEnv = TableEnvironment.create(bbSettings);


//        bsTableEnv.fromDataStream();


    }

}

下面就将Flink和Blink两种Planner来分别写一写API。


Flink


Batch

创建环境变量
/****************************/
        /***  flink Batch  query  ***/
        /****************************/
        ExecutionEnvironment fbEnv = ExecutionEnvironment.getExecutionEnvironment();
        BatchTableEnvironment fbTableEnv = BatchTableEnvironment.create(fbEnv);
创建Table,注册Table,以及各种临时表或者View
/**********************************************/
        /***  在某个catalog下的某个database下创建Table  ***/
        /**********************************************/
        Schema orderSchema = new Schema().field("oid", DataTypes.STRING())
                .field("productname", DataTypes.STRING())
                .field("time", DataTypes.STRING());
        Schema paySchema = new Schema().field("pid", DataTypes.STRING())
                .field("type", DataTypes.STRING())
                .field("ptime", DataTypes.STRING());

        fbTableEnv.connect(new FileSystem().path("/Users/ongbo/Maven/bin/FlinkDemo/src/main/resources/orders.txt"))
                .withFormat(new Csv().fieldDelimiter(',').lineDelimiter("\n"))
                .withSchema(orderSchema)
                .registerTableSource("ordersource");

        //使用connect可以从一个文件或者Kafka等其他外部系统来创建一个表
        fbTableEnv.connect(new FileSystem().path("/Users/ongbo/Maven/bin/FlinkDemo/src/main/resources/payments.txt"))
                .withFormat(new Csv().fieldDelimiter(',').lineDelimiter("\n"))
                .withSchema(paySchema)
                .createTemporaryTable("paytable");

        Table ordertable = fbTableEnv.from("ordersource").select("*");
        Table paytable = fbTableEnv.from("paytable").select("*");

        //基于paytable在default_catalog.default_database注册一个临时view
        fbTableEnv.createTemporaryView("exampleview",paytable);
        //基于paytable在default_catalog.other_database注册一个临时view
        fbTableEnv.createTemporaryView("other_database.exampleview",paytable);
        //基于paytable在default_catalog.default_database注册一个view,那个``里面的内容不会被转成某个catalog下的某个database
        fbTableEnv.createTemporaryView("`example.view`",paytable);
开始查询吧
 /**********************************************/
        /***                    查询                ***/
        /**********************************************/

        try {
            //使用API,这里就需要一个明确的对象Table
            Table filterResult = ordertable.filter("oid='1'").select("*");
            fbTableEnv.toDataSet(filterResult,Row.class).print();
            //使用SQL语句,这里的话可以是某个注册之后的表path,比如上面注册的各种临时view和source表
            Table SQLQueryResult = fbTableEnv.sqlQuery("select * from ordersource where oid='1'");
            fbTableEnv.toDataSet(SQLQueryResult,Row.class).print();
//            fbTableEnv.sqlUpdate("insert into paytable values('23','23','23')");
            Table SQLQueryResult2 = fbTableEnv.sqlQuery("select * from paytable where pid='1'");
            fbTableEnv.toDataSet(SQLQueryResult2,Row.class).print();

        } catch (Exception e) {
            e.printStackTrace();
        }

在这里插入图片描述

Table和DataSet集成

Table和DataSet之间可以相互转换的
分别是fromDataset和toDataSet

/**********************************************/
            /***             转换  DataSet ->>> Table    ***/
            /**********************************************/
            DataSet<Row> rowDataSet = fbTableEnv.toDataSet(SQLQueryResult2, Row.class);
            Table datasetTable = fbTableEnv.fromDataSet(rowDataSet);
            //分别转换成Row,POJO,还有TupleTypeInfo
            fbTableEnv.toDataSet(datasetTable,Row.class).print();
            fbTableEnv.toDataSet(datasetTable, payments.class).print();
            fbTableEnv.toDataSet(datasetTable, new TupleTypeInfo<>(Types.STRING,Types.STRING,Types.STRING)).print();

**执行效果分别是Row,POJO,以及Tuple格式的
在这里插入图片描述
其实还支持了scala中的case类,以及AtomicField,但是这个只有一个字段。

Stream

先创建环境
   /****************************/
        /***  flink stream query  ***/
        /****************************/
        EnvironmentSettings fsSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build();
        StreamExecutionEnvironment fsenv = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment fsTabEnv = StreamTableEnvironment.create(fsenv,fsSettings);
        fsenv.setParallelism(1);
创建连个流表
 /****************************/
        /***  开始创建一个表吧  ***/
        /***  应该也可以使用connect等等  ***/
        /****************************/
        DataStreamSource<order> orderDataStreamSource = fsenv.addSource(new orderSource());
        DataStreamSource<payment> paymentDataStreamSource = fsenv.addSource(new paysource());

        Table orderTable = fsTabEnv.fromDataStream(orderDataStreamSource).as("orderid,productname,timestampo");
        Table payTable = fsTabEnv.fromDataStream(paymentDataStreamSource).as("payid,paytype,timestampp");
查询和转换
//创建一个临时表,也可以使用connect去create和register
//        fsTabEnv.createTemporaryView("tempviewOrder",orderTable);
//        Table selectTable = fsTabEnv.sqlQuery("select * from tempviewOrder where orderid>10 and orderid<20");
        Table selectResult = orderTable.select("*");
        fsTabEnv.toAppendStream(selectResult,Row.class).print();
        fsTabEnv.toRetractStream(selectResult,Row.class).print();

Table转换成Stream有两种方式,一种是Append追加模式,另一种是Retract模式。
Append针对于那种insert的操作,即对以前的数据不更改,直接插入新的数据
而Retract会通过标志位,实现对数据的动态更新,比如是删除还是更新


Blink


这个Blink Planner要和上面的Flink Planner要区别开来了,前面的Flink是会区分DataSet和DataStream的,他们的各种查询语句,插入都会转换成对应的“批”处理程序或者“流”处理程序,而在Blink里面,就统一流批了,所以的DataSet都会看成Stream,所以就不会存在Table去转换成DataSet,总而言之,在Blink里面,你就当做只有Table和DataStream在谈恋爱,而DataSet只是第三者。而作为第三者与现任的区别就是现任DataStream的表是动态的,而DataSet是静态的,但是也可以当做统一流去处理的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小满锅lock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值