背景
Flink使用api执行sql的时候报错
Exception in thread "main" org.apache.flink.table.api.TableException: amount is not found in product, EXPR$0
Exception in thread "main" org.apache.flink.table.api.TableException: amount is not found in product, EXPR$0
at org.apache.flink.table.planner.codegen.SinkCodeGenerator$.$anonfun$generateRowConverterOperator$1(SinkCodeGenerator.scala:78)
at org.apache.flink.table.planner.codegen.SinkCodeGenerator$.$anonfun$generateRowConverterOperator$1$adapted(SinkCodeGenerator.scala:74)
at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:233)
at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:32)
at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:29)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:194)
at scala.collection.TraversableLike.map(TraversableLike.scala:233)
at scala.collection.TraversableLike.map$(TraversableLike.scala:226)
at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:194)
at org.apache.flink.table.planner.codegen.SinkCodeGenerator$.generateRowConverterOperator(SinkCodeGenerator.scala:74)
at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecLegacySink.translateToTransformation(StreamExecLegacySink.scala:197)
at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecLegacySink.translateToPlanInternal(StreamExecLegacySink.scala:127)
at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecLegacySink.translateToPlanInternal(StreamExecLegacySink.scala:48)
at org.apache.flink.table.planner.plan.nodes.exec.ExecNode.translateToPlan(ExecNode.scala:59)
at org.apache.flink.table.planner.plan.nodes.exec.ExecNode.translateToPlan$(ExecNode.scala:57)
at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecLegacySink.translateToPlan(StreamExecLegacySink.scala:48)
at org.apache.flink.table.planner.delegation.StreamPlanner.$anonfun$translateToPlan$1(StreamPlanner.scala:66)
at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:233)
at scala.collection.Iterator.foreach(Iterator.scala:937)
at scala.collection.Iterator.foreach$(Iterator.scala:937)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1425)
at scala.collection.IterableLike.foreach(IterableLike.scala:70)
at scala.collection.IterableLike.foreach$(IterableLike.scala:69)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike.map(TraversableLike.scala:233)
at scala.collection.TraversableLike.map$(TraversableLike.scala:226)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.apache.flink.table.planner.delegation.StreamPlanner.translateToPlan(StreamPlanner.scala:65)
at org.apache.flink.table.planner.delegation.PlannerBase.translate(PlannerBase.scala:167)
at org.apache.flink.table.api.bridge.java.internal.StreamTableEnvironmentImpl.toDataStream(StreamTableEnvironmentImpl.java:331)
at org.apache.flink.table.api.bridge.java.internal.StreamTableEnvironmentImpl.toRetractStream(StreamTableEnvironmentImpl.java:307)
at org.apache.flink.table.api.bridge.java.internal.StreamTableEnvironmentImpl.toRetractStream(StreamTableEnvironmentImpl.java:298)
at org.example.job.sql.SqlDemo2.api(SqlDemo2.java:48)
at org.example.job.sql.SqlDemo2.main(SqlDemo2.java:39)
代码如下
public class SqlDemo2 {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
StreamTableEnvironment table = StreamTableEnvironment.create(env);
//2.Source
DataStream<OrderSqlBase> ds = env.fromElements(
new OrderSqlBase("beer", 3),
new OrderSqlBase("diaper", 4),
new OrderSqlBase("rubber", 2),
new OrderSqlBase("pen", 3),
new OrderSqlBase("rubber", 3),
new OrderSqlBase("beer", 1)
);
// sql(env, table, ds);
api(env, table, ds);
}
private static void api(StreamExecutionEnvironment env, StreamTableEnvironment tableEnv, DataStream<OrderSqlBase> ds) throws Exception {
Table table = tableEnv.fromDataStream(ds);
Table select = table.groupBy($("product"))
.select($("product"), $("amount").sum().as("amount"));
//.as("product", "amount");
DataStream<Tuple2<Boolean, OrderSqlBase>> result = tableEnv.toRetractStream(select, OrderSqlBase.class);
result.print();
env.execute();
}
private static void sql(StreamExecutionEnvironment env, StreamTableEnvironment table, DataStream<OrderSqlBase> ds) throws Exception {
//3.注册表
// convert DataStream to Table
table.createTemporaryView("tableA", ds, $("product"), $("amount"));
Table table1 = table.sqlQuery("SELECT product, SUM(amount) AS amount FROM tableA GROUP BY product");
DataStream<Tuple2<Boolean, OrderSqlBase>> result = table.toRetractStream(table1, OrderSqlBase.class);
result.filter(x -> x.f0).print();
env.execute();
}
}
通过不停的尝试是因为标红的位置写的有问题
通过把需要起别名的字段放在第一个位置,或者是在最后统一起别名的方式能够解决
具体原因目前未知,记录备查