web-dev-qa-db-ja.com

行タイプのエンコーダーSpark Datasets

私が行っているマップ操作のために、DataSetの Row タイプのエンコーダーを作成したいと思います。本質的に、エンコーダーの書き方がわかりません。

以下は、マップ操作の例です。

In the example below, instead of returning Dataset<String>, I would like to return Dataset<Row>

Dataset<String> output = dataset1.flatMap(new FlatMapFunction<Row, String>() {
            @Override
            public Iterator<String> call(Row row) throws Exception {

                ArrayList<String> obj = //some map operation
                return obj.iterator();
            }
        },Encoders.STRING());

文字列ではなく、エンコーダを次のように記述する必要があることを理解しています。

    Encoder<Row> encoder = new Encoder<Row>() {
        @Override
        public StructType schema() {
            return join.schema();
            //return null;
        }

        @Override
        public ClassTag<Row> clsTag() {
            return null;
        }
    };

しかし、私はエンコーダのclsTag()を理解しておらず、同様の何かを打ち消すことができる実行中の例を見つけることを試みています(つまり、行タイプのエンコーダ)

編集-これは言及された質問のコピーではありません: データフレーム行を更新された行にマッピングしようとしているときにエンコーダーエラー Spark 1.x in Spark 2.x(私はそうしていません)、また、エラーを解決するのではなく、Rowクラスのエンコーダを探しています。最後に、Javaではなく、ソリューションを探していましたScalaで。

23
tsar2512

答えは RowEncoder を使用し、データセットのスキーマを StructType を使用することです。

以下は、データセットを使用したフラットマップ操作の実際の例です。

    StructType structType = new StructType();
    structType = structType.add("id1", DataTypes.LongType, false);
    structType = structType.add("id2", DataTypes.LongType, false);

    ExpressionEncoder<Row> encoder = RowEncoder.apply(structType);

    Dataset<Row> output = join.flatMap(new FlatMapFunction<Row, Row>() {
        @Override
        public Iterator<Row> call(Row row) throws Exception {
            // a static map operation to demonstrate
            List<Object> data = new ArrayList<>();
            data.add(1l);
            data.add(2l);
            ArrayList<Row> list = new ArrayList<>();
            list.add(RowFactory.create(data.toArray()));
            return list.iterator();
        }
    }, encoder);
24
tsar2512

私は同じ問題を抱えていた... Encoders.kryo(Row.class))は私のために働いた。

おまけとして、Apache SparkチューニングドキュメントはKryo itを参照します。これは、シリアル化が「多くの場合10倍」になるためです:

https://spark.Apache.org/docs/latest/tuning.html

5
Jim Bob