29

私が行っているマップ操作のために、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 の代わりに、次のように記述する必要があることを理解しています。

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

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

ただし、エンコーダーの clsTag() を理解していないため、似たようなもの (つまり、行型のエンコーダー) をデモできる実行例を見つけようとしています。

編集 - これは、言及された質問のコピーではありません:回答がSpark 2.xでSpark 1.xを使用することについて話しているため、データフレーム行を更新された行にマップしようとしているときにエンコーダーエラーが発生しました(私はそうしていません)、また私は探していますエラーを解決するのではなく、Row クラスのエンコーダーに対して。最後に、Scala ではなく Java で解決策を探していました。

4

2 に答える 2

9

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

おまけとして、Apache Spark のチューニング ドキュメントでは Kryo について言及しています。

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

于 2018-01-26T16:41:26.193 に答える