spark Dataset<Row>的合并 将本地数据转换为spark的 Dataset<Row>类型

由于项目需要,要自己写一个数据转换接口。将Dataset<Row>传入本地算法进行处理,将经过本地算法处理后的行列数据转换为Dataset<Row>返回。

1、获取Dataset<Row>数据到本地

使用list获取数据:

        List<Row> list = dataset.collectAsList();
        int[] getRowLength = new int[list.size()];
        List<List<Double>> listData = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            String temp = list.get(i).toString();
            String temp1 = temp.replaceAll("\\(","")
                    .replaceAll("\\)","")
                    .replaceAll("\\[","")
                    .replaceAll("]","");
            String[] s = temp1.split(",");
            getRowLength[i] = s.length;
            List<Double> listTemp = new ArrayList<>();
            for (int j = 0; j < s.length; j++) {
                listTemp.add(Double.parseDouble(s[j]));
            }
            listData.add(listTemp);
        }

将获取到的数据存入listData中。


经过本地算法处理后,返回的值是数组类型。分为两个数组,一个单列数组一个二维数组。

由于最后要将两个数组分别成表后,再合并,因此需要一个公共列来进行两个dataset的join操作。


2、返回数据转换为Dataset<Row>

将单列数组转换为dataset:

        Dataset<Row> rowDatasetTest = null;
        List<Row> labelListTemp = new ArrayList<>();
        for (int i = 0; i < labelMatrix.length; i++) {
            labelListTemp.add(RowFactory.create(i, labelMatrix[i]));
        }
        StructType schemaLabelTest = new StructType(new StructField[]{
                createStructField("index", IntegerType, false),
                createStructField("label", DoubleType, false)
        });
        rowDatasetTest = this.sparkSession.createDataFrame(labelListTemp,schemaLabelTest);

将二维数组转换为dataset的操作就是,每次循环生成一个表,通过index列进行数据表合并的操作:

        for (int i = 0; i < inputColumns.length; i++) {
            List<Row> listTemp = new ArrayList<>();
            for (int j = 0; j < rowLength; j++) {
                listTemp.add(RowFactory.create(j, dataMatrix[j][i]));
            }
            StructType schemaTest = new StructType(new StructField[]{
                    createStructField("index", IntegerType, false),
                    createStructField(inputColumns[i], DoubleType, false)
            });
            Dataset<Row> temp = this.sparkSession.createDataFrame(listTemp, schemaTest);
            rowDatasetTest = temp.join(rowDatasetTest,"index");
//            rowDatasetTest.show();
        }

结果显示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值