The proctime attribute can only be appended to the table schema and not replace an existing field. Please move 'proctime' to the end of the schema.
翻译过来就是要把proctime添加到schema最后,实际我也放在最后了,还是报错。
在Flink中国社区大神的提醒下发现,要和tuple的字段数量对应上,在tuple的字段数量后面再添加一个proctime。
因为我之前为了让sql支持不同来源,字段数不同的数据,直接用了字段数最大的Tuple25,那么这里要求把proctime添加到最后在定义schema的时候就得把25个字段都写上,然后后面再加一个proctime。
String inTopic = args[0];
String outTopic = args[1];
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>(inTopic, new SimpleStringSchema(), props);
FlinkKafkaProducer<String> producer = new FlinkKafkaProducer<String>(outTopic, new SimpleStringSchema(), props);
DataStream<Tuple25<Long,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String>> stream =
env.addSource(consumer).assignTimestampsAndWatermarks(new MessageWaterEmitter()).flatMap(new FormatMap(sqlConfig.getProperty("SEP")));
tableEnv.registerDataStream(sqlConfig.getProperty("tablename"),stream,sqlConfig.getProperty("tableStruct"));
Table table = tableEnv.sqlQuery(sqlConfig.getProperty("SQL"));
tableEnv.toAppendStream(table, Row.class).flatMap(new RowToStringMap()).addSink(producer);
env.execute("Flink-Kafka Table SQL");
配置文件如下,数据源是逗号分隔的数据,实际字段比较少,但是tableStruct需要按照代码里的Tuple25补齐,最后另外加上proc.proctime,SQL指定需要的字段即可,多余的字段会是null
tablename=test_log
SEP=,
tableStruct=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,proc.proctime
SQL=select a,count(a) from test_log group by TUMPLE(proc, INTERVAL '10' MINUTE), a
这样 Flink SQL 结合 Kafka 可以实现快速的对 Kakfa 数据进行查询处理,感觉类似最近出来的 KSQL。
Tuple 最大只能25个字段,基本也够用了,但是不知道这样25个字段补齐会不会有点浪费资源