将火花行对象转换为 java pojo

Posted

技术标签:

【中文标题】将火花行对象转换为 java pojo【英文标题】:Convert spark row object to java pojo 【发布时间】:2018-06-21 20:13:48 【问题描述】:

在 Spark 中,我们可以使用 df.as[POJO] 将数据集转换为 Java POJO。

我有一个用例,我要连接两个数据集并希望将 Row 对象转换为 Java POJO。

加入后的行对象模式: 根 - 客户 ID - 消息ID - c1 - c2 - c3

Java POJO 根: - 客户 ID:字符串 - messageId:字符串 - 内容:列表[地图]

转换后: 根: - 客户 ID - 消息ID - 内容:[c1: v1, c2: v2, c3: v3]

目前我采用的方法是将 Row 对象转换为 JSON,然后使用 ObjectMapper 将 JSON 转换为 POJO,这是一个具有转换成本的两步过程,我们必须将此转换应用于十亿行。

是否有更好的方法可以将 Row Object 转换为 Java POJO 而无需转换为 JSON 且不使用反射或任何默认 Scala 到 Java 转换器可用。我知道在 Scala 中我们有 'asInstanceof' 可用,但我不确定 Java 中是否有类似的东西。

【问题讨论】:

不太清楚你想要实现什么,代码中的例子会更好。 【参考方案1】:

我假设你有这些: 两个Java bean类,简称A和B;以及 Dataset[A] 和 Dataset[B] 类型的数据。

您正在加入它们并且结果是 DataFrame(或 Dataset[Row] 换句话说)并且您希望将结果类型的 Dataset 转换回某个 bean 类。

最简单的方法是创建 Java bean 类(如果您在应用程序中使用 Scala,则创建案例类),其中包含 A 和 B 之间的所有连接字段(例如命名为 C)。并通过 DataFrame.as[C] 使用转换。

这将导致我理解您想要的结果,而无需与 JSON 进行中间转换。

【讨论】:

但是当我加入 Dataset[A] 和 Dataset[B] 时,它会生成包含两个数据集中所有列的行对象。现在我的 POJO 有不同的结构,所以我不能在这里直接使用 .as[C] 。相反,我使用的是 .map() 函数,它接受行对象并吐出 POJO。根据给出的 POJO 示例,我必须从加入的数据集中自定义地图内容。我也不确定 .as[C] 是否可以给我预期的结果。 是什么阻止你尝试这个?

以上是关于将火花行对象转换为 java pojo的主要内容,如果未能解决你的问题,请参考以下文章

使用jackson将pojo(对象列表)转换为java中的json

将 simplejdbccall 结果集转换为 java 对象

如何在火花中将rdd对象转换为数据框

将 Spark DataFrame 转换为 Pojo 对象

使用 Java 将 JSON 转换为 POJO 并赋值

将带有列表的休眠 POJO 转换为可序列化的 rpc 返回对象