ホーム>source

JavaでSpark 2.3.1を使用しています Datasetをカプセル化するオブジェクトがあります。このオブジェクトをシリアライズおよびデシリアライズできるようにしたいと思います。

私のコードは次のとおりです:

public class MyClass implements Serializable {
    private static final long serialVersionUID = -189012460301698744L;
    public Dataset<Row> dataset;
    public MyClass(final Dataset<Row> dataset) {
        this.dataset = dataset;
    }
    /**
     * Save the current instance of MyClass into a file as a serialized object.
     */
    public void save(final String filepath, final String filename) throws Exception{
        File file = new File(filepath);
        file.mkdirs();
        file = new File(filepath+"/"+filename);
        try (final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {
            oos.writeObject(this);
        } 
    }
    /**
     * Create a new MyClass from a serialized MyClass object
     */
    public static MyClass load(final String filepath) throws Exception{
        final File file = new File(filepath);
        final MyClass myclass;
        try (final ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
              myclass = ((MyClass) ois.readObject());
        }
        System.out.println("test 1 : "+ myclass);
        System.out.println("test 2 : "+ myclass.dataset);
        myclass.dataset.printSchema();
        return myclass;
    }      
    // Some other functions   
}

しかし、シリアル化は適切に行われていないようです。 load()関数を使用すると、次の表示が得られます。

test 1 : MyClass@520e6089
test 2 : Invalid tree; null:
null

そして、printSchema()でjava.lang.NullPointerExceptionをスローします

オブジェクトを適切にシリアル化するために何が欠けていますか?

あなたの答え
  • 解決した方法 # 1

    スパーク・ウィズウィズ  これらの作成に使用されたセッションの範囲でのみ意味があります。したがって、 Datasets のシリアル化  完全に無意味です。

    データをシリアル化する場合は、 Dataset と書くだけです。  永続ストレージに。

    パイプラインを「シリアル化」したい場合は、入力の何らかの形を取り、目的の Dataset を返すコード(メソッド)を使用し続けるだけです。 。 Dataset をシリアル化しようとしないでください  自体。

    Dataset

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ JNIからAndroidにversionNameとversionCodeを取得する方法