微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Java 中为 Spark groupByFunc 传递通用编码器

如何解决在 Java 中为 Spark groupByFunc 传递通用编码器

我有一个数据集 df,我在基类中对它执行以下操作。

class Base {
    public void func() {
      df.map(mapFunc,Encoders.STRING())
        .groupByKey(groupByFunc,Encoders.tuple(Encoders.INT(),Encoders.DATE()));
    }
}

我有几个扩展基类的子类。将为子类调用 mapFunc、groupByFunc。

我面临的问题是我想让用于 groupByKey 的编码器通用,它们可以特定于子类。现在它的硬编码返回 Tuple2。但是我的子类可以向 groupBy 返回任意数量属性,这实际上意味着它不必是 Tuple2 ,它可以一直到 Tuple5(我知道编码器不支持超过 Tuple5),甚至超过 Tuple5。

你是如何做到这一点的?

我尝试为编码器创建一个空 bean,然后使用特定于所有子类的新编码器 bean 对其进行扩展。在 groupByFunc 中,我们将拥有 Encoder.bean(BaseEncoder.class) 并且在每个子类中,我们将返回特定于子类的 Encoder 类的编码器类的对象。但这不起作用。我得到以下异常

java.util.NoSuchElementException: head of empty list

    at scala.collection.immutable.Nil$.head(List.scala:420)
    at scala.collection.immutable.Nil$.head(List.scala:417)
    at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$$anonfun$5.apply(ExpressionEncoder.scala:121)
    at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$$anonfun$5.apply(ExpressionEncoder.scala:120)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)

还有其他方法可以用来解决这种情况吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。