Flink SQL含有聚合算子时无法直接print
Exception in thread "main" org.apache.flink.table.api.TableException: AppendStreamTableSink doesn't support consuming update and delete changes which is produced by node Rank(strategy=[UndefinedStrategy], rankType=[ROW_NUMBER], rankRange=[rankStart=1, rankEnd=1], partitionBy=[category], orderBy=[sales DESC], select=[category, sales])
at org.apache.flink.table.planner.plan.optimize.program.FlinkChangelogModeInferenceProgram$SatisfyModifyKindSetTraitVisitor.createNewNode(FlinkChangelogModeInferenceProgram.scala:355)
at org.apache.flink.table.planner.plan.optimize.program.FlinkChangelogModeInferenceProgram$SatisfyModifyKindSetTrai
原因:
正常情况下默认使用toAppendStream进行表流转化,而聚合操作涉及delete操作,单纯appendStream无法满足,因此考虑使用RetractStream或UpsertStream。
解决:
使用tableEnvironment.toRetractStream()进行输出 例如:
Table table = tEnv.sqlQuery(
"SELECT\n" +
" userName,\n" +
" product,\n" +
" amount\n" +
"FROM\n" +
" orders,\n" +
" user_table\n" +
"WHERE\n" +
" orders.userId = user_table.userId");
Table table = tEnv.sqlQuery("SELECT userId,sum(amount) as boughtSum " +
"FROM orders group by userId");
tEnv.toRetractStream(table, TypeInformation.of(new TypeHint<Tuple2<String, Integer>>() {
})).print();