【问题标题】:map row in Dataset<Row> to object class Spark Java将 Dataset<Row> 中的行映射到对象类 Spark Java
【发布时间】:2018-10-01 10:11:21
【问题描述】:

使用 HBase 和 Parquet,我编写了代码以从 HBase 获取值并将值映射到 Object 类,但我无法使用 Dataset 将其复制到 Parquet。

HBase:

JavaPairRDD<ImmutableBytesWritable, Result> data = sc.newAPIHadoopRDD(getHbaseConf(),
            TableInputFormat.class, ImmutableBytesWritable.class, Result.class);

JavaRDD<List<Tuple3<Long, Integer, Double>>> tempData = data
                .values()
                //Uses HBaseResultToSimple... class to parse the data.
                .map(value -> {
                    SimpleObject object = oParser.call(value);
                    // Get the sample property, remove leading and ending spaces and split it by comma
                    // to get each sample individually
                    List<Tuple2<String, Integer>> samples = zipWithIndex((object.getSamples().trim().split(",")));

                    // Gets the unique identifier for that sp.
                    Long sp = object.getPos();

                    // Calculates the hamming distance for this sp for each sample.
                    // i.e. 0|0 => 0, 0|1 => 1, 1|0 => 1, 1|1 => 2
                    return samples.stream().map(t -> {
                        String alleles = t._1();
                        Integer patient = t._2();

                        List<String> values = Arrays.asList(alleles.split("\\|"));

                        Double firstA = Double.parseDouble(values.get(0));
                        Double second = Double.parseDouble(values.get(1));

                        // Returns the initial sp id, p id and the distance in form of Tuple.
                        return new Tuple3<>(snp, patient, firstAllele + secondAllele);
                    }).collect(Collectors.toList());
                });

我将 Parquet 中的数据读取到数据集中,但简单无法复制上述方法。

Dataset<Row> url = session.read().parquet(fileName);

我只需要知道如何将Dataset&lt;Row&gt; 中的行映射到对象类,就像我在上述方法中对.map(value -&gt; {... 所做的那样。

任何帮助将不胜感激。

【问题讨论】:

    标签: java apache-spark java-8 functional-programming parquet


    【解决方案1】:

    选项 1: 将您的数据框(又名 Dataset&lt;Row&gt;)转换为类型化数据集。假设 Data 类是一个简单的 Java bean,适合您的 parquet 文件的结构,您可以使用:

    Dataset<Data> ds = inputDf.as(Encoders.bean(Data.class));
    

    在此数据集上,您可以使用具有类型访问权限的地图函数:

    Dataset<String> ds2 = ds.map( d -> d.getA(), Encoders.STRING());
    

    (在本例中,我假设类 Data 有一个名为 A 的 String 类型的属性。)

    选项 2: 另一个不需要额外类的选项是直接在地图调用中使用 Row 对象:

    Dataset<String> ds3 = inputDf.map(r -> r.getString(0), Encoders.STRING());
    

    (同样,我假设第一列是一个字符串。)

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2020-10-21
      • 2018-04-19
      • 2020-08-16
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多