【问题标题】:Is it better to use Row or GenericRowData with DataStream API?将 Row 或 GenericRowData 与 DataStream API 一起使用会更好吗?
【发布时间】:2022-11-02 05:41:03
【问题描述】:

我正在使用 flink 1.15.2,我应该使用继承 RowData 的 Row 还是 GenericRowData 作为我自己的数据类型?,我主要使用流 api。 谢谢。 签名。

【问题讨论】:

  • 为什么不能使用 POJO 作为数据类型?

标签: apache-flink flink-streaming flink-sql


【解决方案1】:

一般来说,DataStream API 在记录类型方面非常灵活。 POJO 类型可能是最方便的类型。基本上可以使用任何 Java 类,但您需要检查哪个 TypeInformation 是通过反射提取的。有时需要手动覆盖它。

对于Row,您将始终必须手动提供类型,因为反射不能基于类签名做很多事情。

GenericRowData 应该避免使用,它是一个包含许多警告的内部类(字符串必须是 StringData 并且数组处理并不简单)。反序列化后GenericRowData 也变为BinaryRowData。 TLDR 此类型适用于 SQL 引擎。

【讨论】:

  • 我们现在确实使用了 row,但是看到了很多为 rowdat 内置的序列化程序,例如:parquet、orc。这就是我问的原因,实际上我们构建了一个通用解决方案,用户只提供功能。对于 Pojo,我们观察开销与行。谢谢
【解决方案2】:

docs 在这里实际上很有帮助,我也很困惑。

顶部标题为“所有已知的实现类”的部分列出了所有实现。 RowDataGenericRowData 被描述为内部数据结构。如果您可以使用 POJO,那就太好了。但是,如果您需要实现 RowData 的东西,请查看 BinaryRowDataBoxedWrapperRowDataColumnarRowDataNestedRowData 或其中未列为内部的任何实现。

我个人使用NestedRowDataDataStream[Row] 映射到DataStream[RowData],我完全不确定这是一个好主意:) 特别是因为我似乎无法添加string 属性

【讨论】:

  • (顺便说一句,看起来BoxedWrapperRowData 允许设置像 String 这样的非原始类型,但在 Flink 1.15 中,它在文档和源代码 [1] 中,但由于某种原因 IntelliJ 找不到它...... Flink 太奇怪了...) [1] github.com/apache/flink/blob/release-1.15/flink-table/…
猜你喜欢
  • 2013-01-25
  • 2010-11-11
  • 2018-10-10
  • 2015-10-06
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多