【已解决】Flink Table 转 DataStream报错

博客指出,在Flink table和DataStream进行互转时,若指定了自定义的pojo类,该类必须为public,否则会报错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flink table和DataStream互转的时候,如果指定了自定义的pojo类,需要这个类是public的,否则就会报如下错误。

 

Exception in thread "main" org.apache.flink.table.api.TableException: A raw type backed by type information has no serializable string representation. It needs to be resolved into a proper raw type.
	at org.apache.flink.table.types.logical.TypeInformationRawType.asSerializableString(TypeInformationRawType.java:101)
	at org.apache.flink.table.planner.sinks.TableSinkUtils$$anonfun$3.apply(TableSinkUtils.scala:95)
	at org.apache.flink.table.planner.sinks.TableSinkUtils$$anonfun$3.apply(TableSinkUtils.scala:95)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
	at scala.collection.Iterator$class.foreach(Iterator.scala:891)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
	at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
	at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
	at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
	at scala.collection.AbstractTraversable.map(Traversable.scala:104)
	at org.apache.flink.table.planner.sinks.TableSinkUtils$.validateSchemaAndApplyImplicitCast(TableSinkUtils.scala:95)
	at org.apache.flink.table.planner.delegation.PlannerBase.translateToRel(PlannerBase.scala:260)
	at org.apache.flink.table.planner.delegation.PlannerBase$$anonfun$1.apply(PlannerBase.scala:163)
	at org.apache.flink.table.planner.delegation.PlannerBase$$anonfun$1.apply(PlannerBase.scala:163)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
	at scala.collection.Iterator$class.foreach(Iterator.scala:891)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
	at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
	at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
	at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
	at scala.collection.AbstractTraversable.map(Traversable.scala:104)
	at org.apache.flink.table.planner.delegation.PlannerBase.translate(PlannerBase.scala:163)
	at org.apache.flink.table.api.bridge.java.internal.StreamTableEnvironmentImpl.toDataStream(StreamTableEnvironmentImpl.java:331)
	at org.apache.flink.table.api.bridge.java.internal.StreamTableEnvironmentImpl.toAppendStream(StreamTableEnvironmentImpl.java:292)
	at org.apache.flink.table.api.bridge.java.internal.StreamTableEnvironmentImpl.toAppendStream(StreamTableEnvironmentImpl.java:283)
	at it.kenn.demo.JoinDemo.main(JoinDemo.java:63)

Process finished with exit code 1

 

 

 

Flink SQL 中处理字符串换为整数(INT)时遇到无法换的情况,你可以使用 `try-catch` 或者异常处理函数来解决这个问题,避免程序因错误而中断。例如,可以使用 `CAST` 函数结合 `COALESCE` 或 `CASE` 来尝试换并提供默认值或异常处理: 1. 使用 `COALESCE` 和 `TRY_CAST`: ```sql SELECT COALESCE(TRY_CAST(col AS INT), NULL) FROM your_table; ``` 如果 `col` 无法换为 `INT`,`TRY_CAST` 会返回 `NULL`,然后 `COALESCE` 会选择第二个参数作为结果。 2. 使用 `CASE` 语句: ```sql SELECT CASE WHEN TRY_CAST(col AS INT) IS NOT NULL THEN TRY_CAST(col AS INT) ELSE '无法换' END FROM your_table; ``` 这里,如果换成功就显示数字,失败则返回 '无法换'。 为了捕获换失败时产生的特定异常,你可以在 Flink 的 Java API 中使用 `ExecutionEnvironment.executeInStreamingMode()` 和 `map()` 函数配合异常处理: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<String> textStream = env.socketTextStream("localhost", 9999); DataStream<Integer> intStream = textStream.map(new MapFunction<String, Integer>() { @Override public Integer map(String value) throws Exception { try { return Integer.parseInt(value); } catch (NumberFormatException e) { // 处理异常,可以选择丢弃、记录日志或者返回默认值 log.error("Failed to convert string to int: {}", value); return null; // 或者抛出异常,由上层处理 } } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值