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) 编辑 收藏 举报