由于项目需要,要自己写一个数据转换接口。将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();
}
结果显示: