假设我们的数据框有4列A,B,C,D。现在我想要的是将B,C,D列值组合为Vector并将它们添加为新列,即将列E添加到现有数据帧中。我想直接在数据框中执行此操作,而不将其转换为RDD,然后将向量值添加到RDD,然后将其转换回数据帧。因为这不是一个好的解决方案。
所以,我想要一些Java解决方案直接在Dataframe API中完成。
答案 0 :(得分:0)
对于此方案您可以使用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
希望这有效