假设我们有 4 列 A、B、C、D 的数据框。现在我想要的是将 B,C,D 列值组合为矢量并将它们作为新列(即 E 列)添加到现有数据框中。我想直接在数据框中执行此操作,而无需将其转换为RDD,然后将向量值添加到RDD,然后将其转换回数据帧。因为这不是好的解决方案。
所以,我希望一些Java解决方案直接在Dataframe API中做到这一点。
对于此方案,您可以使用VectorAssemBler
这是示例代码
import java.util.Arrays;
import org.apache.spark.ml.feature.VectorAssembler;
import org.apache.spark.ml.linalg.VectorUDT;
import org.apache.spark.ml.linalg.Vectors;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.types.*;
import static org.apache.spark.sql.types.DataTypes.*;
StructType schema = createStructType(new StructField[]{
createStructField("id", IntegerType, false),
createStructField("hour", IntegerType, false),
createStructField("mobile", DoubleType, false),
createStructField("userFeatures", new VectorUDT(), false),
createStructField("clicked", DoubleType, false)
});
Row row = RowFactory.create(0, 18, 1.0, Vectors.dense(0.0, 10.0, 0.5), 1.0);
Dataset<Row> dataset = spark.createDataFrame(Arrays.asList(row), schema);
VectorAssembler assembler = new VectorAssembler()
.setInputCols(new String[]{"hour", "mobile", "userFeatures"})
.setOutputCol("features");
Dataset<Row> output = assembler.transform(dataset);
System.out.println(output.select("features", "clicked").first());
有关进一步的使用,请查看下面的此链接https://spark.apache.org/docs/2.0.2/ml-features.html#vectorassembler
希望这有效