簡體   English   中英

行類型 Spark 數據集的編碼器

[英]Encoder for Row Type 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 2.x 中使用 Spark 1.x(我沒有這樣做),我也在尋找對於 Row 類的編碼器,而不是解決錯誤。 最后,我正在尋找 Java 中的解決方案,而不是 Scala 中的解決方案。

答案是使用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);

我遇到了同樣的問題... Encoders.kryo(Row.class))為我工作。

作為獎勵,Apache Spark 調優文檔提到了 Kryo 它,因為它的序列化速度“通常高達 10 倍”:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM