Spark Java:通过从不同列中获取值,将向量值添加为DataFrame中的新列

时间:2017-01-13 05:02:36

标签: apache-spark dataframe spark-dataframe

假设我们的数据框有4列A,B,C,D。现在我想要的是将B,C,D列值组合为Vector并将它们添加为新列,即将列E添加到现有数据帧中。我想直接在数据框中执行此操作,而不将其转换为RDD,然后将向量值添加到RDD,然后将其转换回数据帧。因为这不是一个好的解决方案。

所以,我想要一些Java解决方案直接在Dataframe API中完成。

1 个答案:

答案 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

希望这有效