【问题标题】:How to delete/filter the specific rows from a spark dataframe如何从火花数据框中删除/过滤特定行
【发布时间】:2020-03-11 08:10:14
【问题描述】:

我想从 Spark 数据框中删除特定记录:
示例输入:

预期输出:

丢弃的行:

我已经编写了以下代码来过滤数据帧(这是不正确的):


val Name = List("Rahul","Mahesh","Gaurav")
val Age =List(20,55)

val final_pub_df = df.filter(!col("Name").isin(Name:_*) &&  !col("Age").isin(Age:_*))

所以我的问题是 - 如何使用特定过滤条件过滤多个列的数据框。 应根据名称和年龄字段的组合过滤数据框。

【问题讨论】:

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


    【解决方案1】:

    这是解决方案。根据您的数据集,我提出了问题 -

    下面的数据框有不正确的条目。我想删除所有不正确的记录,只保留正确的记录 -

    val Friends = Seq(
          ("Rahul", "99", "AA"),
          ("Rahul", "20", "BB"),
          ("Rahul", "30", "BB"),
          ("Mahesh", "55", "CC"),
          ("Mahesh", "88", "DD"),
          ("Mahesh", "44", "FF"),
          ("Ramu", "30", "FF"),
          ("Gaurav", "99", "PP"),
          ("Gaurav", "20", "HH")).toDF("Name", "Age", "City")
    

    过滤数组 -

    val Name = List("Rahul", "Mahesh", "Gaurav")
    val IncorrectAge = List(20, 55)
    

    数据操作-

    Friends.filter(!(col("Name").isin(Name: _*) && col("Age").isin(IncorrectAge: _*))).show
    

    这是输出 -

    +------+---+----+
    |  Name|Age|City|
    +------+---+----+
    | Rahul| 99|  AA|
    | Rahul| 30|  BB|
    |Mahesh| 88|  DD|
    |Mahesh| 44|  FF|
    |  Ramu| 30|  FF|
    |Gaurav| 99|  PP|
    +------+---+----+
    
    

    你也可以在joins的帮助下做到这一点..

    创建不良记录 df -

    val badrecords = Friends.filter(col("Name").isin(Name: _*) && col("Age").isin(IncorrectAge: _*))
    

    用户 left_anti 加入选择好友减去不良记录 -

     Friends.alias("left").join(badrecords.alias("right"), Seq("Name", "Age"), "left_anti").show
    

    这是输出 -

    +------+---+----+
    |  Name|Age|City|
    +------+---+----+
    | Rahul| 99|  AA|
    | Rahul| 30|  BB|
    |Mahesh| 88|  DD|
    |Mahesh| 44|  FF|
    |  Ramu| 30|  FF|
    |Gaurav| 99|  PP|
    +------+---+----+
    

    【讨论】:

      【解决方案2】:

      我认为您可能想要翻转 not 条件 .... 数据框中的过滤器是 sql 中 where 子句的别名。

      所以你希望查询是

      df.filter(col("Name").isin(Name:_*) && col("Age").isin(Age:_*))
      

      【讨论】:

      • @Shankar Koirala 以上解决方案将只保留过滤后的记录,但我想保留除过滤器数据之外的主要记录。
      • 与斯塔克的要求相反。
      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 2017-06-05
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多