【问题标题】:How to remove unwanted rows in dataframe based on a list of items or descriptions如何根据项目或描述列表删除数据框中不需要的行
【发布时间】:2023-03-20 10:44:01
【问题描述】:

我有一个包含完整 IP 地址的数据框。 我有一个要从数据框中删除的 IP 地址列表。 在根据“lista”删除所有IP地址后,我想有一个新的数据帧“filtered_list”。

我在How to use NOT IN clause in filter condition in spark 看到了一个例子。但即使在过滤器上做“不”之前,我似乎也无法让它工作,请帮忙。

示例:

var df = Seq("119.73.148.227", "42.61.124.218", "42.61.66.174", "118.201.94.2","118.201.149.146", "119.73.234.82", "42.61.110.239", "58.185.72.118", "115.42.231.178").toDF("ipAddress")

var lista = List("119.73.148.227", "118.201.94.2")

var filtered_list = df.filter(col("ipAddress").isin(lista))

我遇到以下错误消息:

java.lang.RuntimeException: Unsupported literal type class scala.collection.immutable.$colon$colon List(119.73.148.227, 118.201.94.2)
  at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:77)
  at org.apache.spark.sql.catalyst.expressions.Literal$$anonfun$create$2.apply(literals.scala:163)
  at org.apache.spark.sql.catalyst.expressions.Literal$$anonfun$create$2.apply(literals.scala:163)
  at scala.util.Try.getOrElse(Try.scala:79)
  at org.apache.spark.sql.catalyst.expressions.Literal$.create(literals.scala:162)
  at org.apache.spark.sql.functions$.typedLit(functions.scala:113)
  at org.apache.spark.sql.functions$.lit(functions.scala:96)
  at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:787)
  at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:787)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
  at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
  at scala.collection.AbstractTraversable.map(Traversable.scala:104)
  at org.apache.spark.sql.Column.isin(Column.scala:787)
  ... 52 elided

【问题讨论】:

    标签: scala list apache-spark dataframe filter


    【解决方案1】:

    isin 采用可变参数,而不是 List。您必须使用:_* ascription 将您的列表分成单独的元素:

    var filtered_list = df.filter(col("ipAddress").isin(lista: _*))
    

    【讨论】:

      【解决方案2】:

      您可以在数据帧上使用 except 方法。

      var df = Seq("119.73.148.227", "42.61.124.218", "42.61.66.174", "118.201.94.2","118.201.149.146", "119.73.234.82", "42.61.110.239", "58.185.72.118", "115.42.231.178").toDF("ipAddress")
      
      var lista = Seq("119.73.148.227", "118.201.94.2").toDF("ipAddress")
      
      var onlyWantedIp = df.except(lista)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多