Spark 2.2.0:如何防止CountVectorizer从Dataset中提供NoneZeroVector VectorsUDT

时间:2018-01-07 18:30:01

标签: java apache-spark apache-spark-dataset

您好,社区我是这里的新成员,我想提出一个简单的愚蠢问题。我试图在具有给定词汇的向量中转换文本文档。与火花例子一样。我的问题是我在某些情况下采用空载体。 对我来说做一些事情来处理它是非常重要的,但我不能!!

这是我的代码

 List<Row> data = Arrays.asList(
                RowFactory.create(Arrays.asList("zero", "zero", "zero")),
                RowFactory.create(Arrays.asList("a", "b", "c")),
                RowFactory.create(Arrays.asList("a", "b", "b", "c", "a"))
        );
        StructType schema = new StructType(new StructField[]{
                new StructField("text", new ArrayType(DataTypes.StringType, true), false, Metadata.empty())
        });
        Dataset<Row> df = spark.createDataFrame(data, schema);


         // alternatively, define CountVectorizerModel with a-priori vocabulary
        CountVectorizerModel cvm = new CountVectorizerModel(new String[]{"a", "b", "c"})
                .setInputCol("text")
                .setOutputCol("feature");

        cvm.transform(df).show(false);

这是输出。我想处理或删除第一列,或者是将空矢量实例化为0.0

的任何其他选项
+------------------+-------------------------+
|text              |feature                  |
+------------------+-------------------------+
|[zero, zero, zero]|(3,[],[])                |
|[a, b, c]         |(3,[0,1,2],[1.0,1.0,1.0])|
|[a, b, b, c, a]   |(3,[0,1,2],[2.0,2.0,1.0])|
+------------------+-------------------------+

如果有人能帮助我在java中做到这一点,我将不胜感激

1 个答案:

答案 0 :(得分:1)

  

将空矢量实例化为0.0

你不必做任何事情。 (3,[],[])不为空 - 它是SparseVector代表,相当于DenseVector [0.0, 0.0, 0.0]

要删除

您可以创建udf

import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.ml.linalg.Vector;

UDF1 isEmpty = new UDF1<Vector,Boolean>() {
    public Boolean call(Vector vector) throws Exception {
        return vector.toSparse().numActives() == 0;
    }
};

spark.udf().register("isEmpty", isEmpty, DataTypes.BooleanType);

并将其与SQLTransformer

一起使用
SQLTransformer sqlTrans = new SQLTransformer().setStatement(
  "SELECT * FROM __THIS__ WHERE NOT isEmpty(feature)");

但请不要 - &#34;空&#34;矢量是有价值信息的来源。