flink1.11.1,全新的table api

最新在自学flink,直接上的最新版,学到了table api,发现flink1.11/.1版本和flink1.10.1版本有很大差别。因为是新版本目前网上资料也不多,我通过查阅官网和自己编码运行,简单写了个demo分享和讲解一下。

 

  • 新api提供的TableEnvironment接口,直接提供了接受原始数据的方法

flink1.10.1的TableEnvironment没有仅有fromTableSource,和from两个方法返回Table

fromTableSource(TableSource<?> source)
Creates a table from a table source.

from(String path)
Reads a registered table and returns the resulting Table.

针对流数据或者批数据必须使用TableEnvironment接口下的BatchTableEnvironment接口和StreamTableEnvironment接口提供的方法,针对原始数据源调用不同方法接受数据,但是流数据似乎还没有提供接口接收数据,而且接受的方法应该还只是测试实验性质。

flink1.11.1中TableEnvironment提供了fromValues方法以及其重载方法,用于接受原生数据,并且fromTableSource已经是过时方法。

fromValues(AbstractDataType<?> rowType, Expression... values)
Creates a Table from given collection of objects with a given row type.

 

  • 新表达式

fromValues很多重载方法必须接受DataTypes.ROW抽象数据模型,对此flink1.11.1提供了新的表达式api方便开发人员进行编写代码

    /**
     * Creates a row of expressions.
     */
    public static ApiExpression row(Object head, Object... tail) {
        return apiCallAtLeastOneArgument(BuiltInFunctionDefinitions.ROW, head, tail);
    }

以下是一个简单demo

 1         String words = "hello flink hello blink hello muscle hello power";
 2         List<ApiExpression> wordList = Arrays.stream(words.split("\\W+"))
 3                 .map(word -> row(word, 1))
 4                 .collect(Collectors.toList());
 5         //注册成表,指定字段
 6         Table table = tblEnv.fromValues(
 7                 DataTypes.ROW(
 8                         DataTypes.FIELD("word", DataTypes.STRING().notNull()),
 9                         DataTypes.FIELD("frequency", DataTypes.INT().notNull())
10                 ), wordList);
11         table.printSchema();
12         tblEnv.createTemporaryView("word_count", table);
13 
14         //执行查询
15         Table table2 = tblEnv.sqlQuery("select word, sum(frequency) from word_count group by word");
16         table2.execute().print();

 

posted on 2020-08-16 15:54  SaltFishYe  阅读(1202)  评论(0编辑  收藏  举报

导航