当前位置: 首页 > 知识库问答 >
问题:

将Dataset中的行映射到对象类SparkJava

弓嘉纳
2023-03-14

在使用HBase和Parquet时,我编写了从HBase获取值并将值映射到对象类的代码,但在使用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());
                });

我将数据从拼花地板读入数据集,但simple无法复制上述方法。

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

我只需要知道如何映射数据集中的行

任何帮助都将不胜感激。


共有1个答案

侯沈义
2023-03-14

选项1:转换数据帧(也称为数据集

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

在此数据集上,可以使用具有类型化访问权限的映射函数:

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

(在本例中,我假设类Data有一个名为a的字符串类型属性。)

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

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

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

 类似资料:
  • 问题内容: 我正在尝试将JSON文件映射到类对象,然后根据新接收的JSON更新卡。 我的JSON结构是这样的 我的班级看起来像这样: 如何将JSON文件中的值映射到CardInfo类创建的对象的字段中? 更新资料 以下试用版在 ci.description上 打印为null ,是否表示从未创建该对象? 更新2 打印cardInfo给出以下内容: {$ class:FirstCard,id:1,说明

  • 问题内容: 我有一个具有16个属性的用户类,例如名,姓,dob,用户名,密码等。这些都存储在MySQL数据库中,当我要检索用户时,我使用ResultSet。我想将每个列映射回用户属性,但是我的操作方式似乎效率很低。例如我在做: 即我检索所有列,然后通过将所有列值插入到User构造函数中来创建用户对象。 有谁知道更快,更整洁的方法吗? 问题答案: 无需将resultSet值存储到String中,也无

  • 假设我有这样的物体 我正在使用RestTemboard类从URL中获取json,如下所示: 之后,我想使用jackson对象映射器将json字符串转换为一个对象 将实体类作为第二个参数传递 问题是我应该如何编写ExampleJson实体来处理get-Showed json?我试过这样上课,但似乎不管用。 我得到了这样一个例外:

  • 您好,在boost或std中是否有一个容器,其中键是类型名,值是对象/实例??? 我想要实现的是,对于每种数据类型,我都有一个对象池,当我想要构造那个对象时,我只想通过键获取。我已经有了工作代码,但如果我使用更标准的代码,我会更高兴。 目前我有这样一个代码: 编辑:我想要的是一个COMPILE-TIME映射。你可以想象一个std::元组

  • 下面是我的DTO。 源DTO 目标DTO

  • 我使用http://jsonlint.com来验证JSON是否有效。因此,我要么需要更改JSON或代码,要么可能两者都需要。有什么想法吗?