【发布时间】:2022-11-02 05:41:03
【问题描述】:
我正在使用 flink 1.15.2,我应该使用继承 RowData 的 Row 还是 GenericRowData 作为我自己的数据类型?,我主要使用流 api。 谢谢。 签名。
【问题讨论】:
-
为什么不能使用 POJO 作为数据类型?
标签: apache-flink flink-streaming flink-sql
我正在使用 flink 1.15.2,我应该使用继承 RowData 的 Row 还是 GenericRowData 作为我自己的数据类型?,我主要使用流 api。 谢谢。 签名。
【问题讨论】:
标签: apache-flink flink-streaming flink-sql
一般来说,DataStream API 在记录类型方面非常灵活。 POJO 类型可能是最方便的类型。基本上可以使用任何 Java 类,但您需要检查哪个 TypeInformation 是通过反射提取的。有时需要手动覆盖它。
对于Row,您将始终必须手动提供类型,因为反射不能基于类签名做很多事情。
GenericRowData 应该避免使用,它是一个包含许多警告的内部类(字符串必须是 StringData 并且数组处理并不简单)。反序列化后GenericRowData 也变为BinaryRowData。 TLDR 此类型适用于 SQL 引擎。
【讨论】:
docs 在这里实际上很有帮助,我也很困惑。
顶部标题为“所有已知的实现类”的部分列出了所有实现。 RowData 和 GenericRowData 被描述为内部数据结构。如果您可以使用 POJO,那就太好了。但是,如果您需要实现 RowData 的东西,请查看 BinaryRowData、BoxedWrapperRowData、ColumnarRowData、NestedRowData 或其中未列为内部的任何实现。
我个人使用NestedRowData 将DataStream[Row] 映射到DataStream[RowData],我完全不确定这是一个好主意:) 特别是因为我似乎无法添加string 属性
【讨论】:
BoxedWrapperRowData 允许设置像 String 这样的非原始类型,但在 Flink 1.15 中,它在文档和源代码 [1] 中,但由于某种原因 IntelliJ 找不到它...... Flink 太奇怪了...) [1] github.com/apache/flink/blob/release-1.15/flink-table/…