【问题标题】:Apache Spark ML Pipeline: filter empty rows in datasetApache Spark ML Pipeline:过滤数据集中的空行
【发布时间】:2019-04-21 14:25:07
【问题描述】:

在我的 Spark ML 管道 (Spark 2.3.0) 中,我像这样使用 RegexTokenizer

val regexTokenizer = new RegexTokenizer()
      .setInputCol("text")
      .setOutputCol("words")
      .setMinTokenLength(3)

它将DataFrame 转换为带有单词数组的那个,例如:

text      | words
-------------------------
a the     | [the]
a of to   | []
big small | [big,small]

如何过滤带有空[] 数组的行? 我应该创建自定义转换器并将其传递给管道吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql apache-spark-mllib apache-spark-ml


    【解决方案1】:

    你可以使用SQLTransformer:

    import org.apache.spark.ml.feature.SQLTransformer
    
    val emptyRemover = new SQLTransformer().setStatement(
      "SELECT * FROM __THIS__ WHERE size(words) > 0"
    )
    

    可以直接申请

    val df = Seq(
      ("a the", Seq("the")), ("a of the", Seq()), 
      ("big small", Seq("big", "small"))
    ).toDF("text", "words")
    
    emptyRemover.transform(df).show
    
    +---------+------------+
    |     text|       words|
    +---------+------------+
    |    a the|       [the]|
    |big small|[big, small]|
    +---------+------------+
    

    或用于Pipeline

    不过,在 Spark ML 流程中使用它之前,我会考虑两次。通常下游使用的工具,如CountVectorizer,可以很好地处理空输入:

    import org.apache.spark.ml.feature.CountVectorizer
    
    val vectorizer = new CountVectorizer()
      .setInputCol("words")
      .setOutputCol("features")
    
    +---------+------------+-------------------+                 
    |     text|       words|           features|
    +---------+------------+-------------------+
    |    a the|       [the]|      (3,[2],[1.0])|
    | a of the|          []|          (3,[],[])|
    |big small|[big, small]|(3,[0,1],[1.0,1.0])|
    +---------+------------+-------------------+
    

    并且某些词不存在,通常可以提供有用的信息。

    【讨论】:

      【解决方案2】:
      df
        .select($text, $words)
        .where(size($words) > 0)
      

      【讨论】:

      • 我不能这样做,因为我使用管道。我可以创建自定义转换器来包装此代码,但我想知道是否还有其他选项
      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多