【问题标题】:Java Object serialization in scalascala中的Java对象序列化
【发布时间】:2019-06-11 10:16:39
【问题描述】:

请原谅我是 Scala 的新手。 我创建了一个包含一些信息的案例类。我想要接受的对象之一是 JavaClass。当我在 spark 中使用时,我需要它是可序列化的。我怎样才能做到这一点?

Java 类

public class Currency {

    public Currency(final BigDecimal amount, final CurrencyUnit unit) {
        //Doing Something
    }
}

case class ReconEntity(inputCurrency : Currency, outputCurrency : Currency)

使用隐式我希望获得 Currency 的序列化代码,以便 spark 可以在 ReconEntity 上工作。

【问题讨论】:

  • 只需添加这个:公共类 Currency extends Serializable
  • 这看起来像是对我的回答。
  • @bupt_ljy,我不拥有该课程,因此无法进行更改

标签: scala apache-spark


【解决方案1】:

首先,您是否尝试过使用CurrencyReconEntity 类的一些RDD 操作?你真的得到错误吗?至少,Spark 能够使用明显不可序列化的 Scala 类作为值来处理 RDD 操作(您可以在 spark-shell 中尝试此操作,尽管这可能需要启用 Kryo serializer)。

由于您声明您不拥有Currency 类,因此您不能添加extends Serializable,这将是最简单的解决方案。

另一种方法是使用可序列化的包装器来包装类,如本文所述:Beating Serialization in Spark - 为方便起见,此处复制示例代码:

对于简单的类,最简单的方法是制作一个包装接口 扩展可序列化。这意味着即使 UnserializableObject 无法序列化我们可以不带任何对象传入以下对象 问题

public interface UnserializableWrapper extends Serializable {
  public UnserializableObject create(String prm1, String prm2);
}

然后可以使用 跟随方法

UnserializableWrapper usw = new UnserializableWrapper() {
  public UnserializableObject create(String prm1, String prm2) {
    return new UnserializableObject(prm1,prm2);
} }

如果类只是一个数据结构,没有重要的方法,那么将其字段解包到 RDD 类型(在您的情况下为ReconEntity)并丢弃类本身可能会更容易。

如果该类具有您需要的方法,那么您的另一个(丑陋)选择是将代码剪切并粘贴到新的可序列化类或 Spark 代码中的辅助函数中。

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2020-04-26
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多