火花数据帧中滤波的多个条件

问题描述 投票:25回答:7

我有一个包含四个字段的数据框。其中一个字段名称是Status,我试图在.filter中使用OR条件来表示数据帧。我试过下面的查询,但没有运气。

df2 = df1.filter(("Status=2") || ("Status =3"))

df2 = df1.filter("Status=2" || "Status =3")

有没有人以前用过这个。我在堆栈溢出here上看到了类似的问题。他们使用下面的代码来使用OR条件。但该代码适用于pyspark。

from pyspark.sql.functions import col 

numeric_filtered = df.where(
(col('LOW')    != 'null') | 
(col('NORMAL') != 'null') |
(col('HIGH')   != 'null'))
numeric_filtered.show()
apache-spark apache-spark-sql spark-dataframe
7个回答
37
投票

代替:

df2 = df1.filter("Status=2" || "Status =3")

尝试:

df2 = df1.filter($"Status" === 2 || $"Status" === 3)

4
投票

这个问题已经得到解答,但为了将来参考,我想提一下,在这个问题的上下文中,数据集/数据帧中的wherefilter方法支持两种语法:SQL字符串参数:

df2 = df1.filter(("Status = 2 or Status = 3"))

和基于Col的参数(由@David提及):

df2 = df1.filter($"Status" === 2 || $"Status" === 3)

OP似乎结合了这两种语法。就个人而言,我更喜欢第一种语法,因为它更干净,更通用。


1
投票

你需要使用过滤器

package dataframe

import org.apache.spark.sql.SparkSession
/**
 * @author [email protected]
 */
//

object DataFrameExample{
  //
  case class Employee(id: Integer, name: String, address: String, salary: Double, state: String,zip:Integer)
  //
  def main(args: Array[String]) {
    val spark =
      SparkSession.builder()
        .appName("DataFrame-Basic")
        .master("local[4]")
        .getOrCreate()

    import spark.implicits._

    // create a sequence of case class objects 

    // (we defined the case class above)

    val emp = Seq( 
    Employee(1, "vaquar khan", "111 algoinquin road chicago", 120000.00, "AZ",60173),
    Employee(2, "Firdos Pasha", "1300 algoinquin road chicago", 2500000.00, "IL",50112),
    Employee(3, "Zidan khan", "112 apt abcd timesqure NY", 50000.00, "NY",55490),
    Employee(4, "Anwars khan", "washington dc", 120000.00, "VA",33245),
    Employee(5, "Deepak sharma ", "rolling edows schumburg", 990090.00, "IL",60172),
    Employee(6, "afaq khan", "saeed colony Bhopal", 1000000.00, "AZ",60173)
    )

    val employee=spark.sparkContext.parallelize(emp, 4).toDF()

     employee.printSchema()

    employee.show()


    employee.select("state", "zip").show()

    println("*** use filter() to choose rows")

    employee.filter($"state".equalTo("IL")).show()

    println("*** multi contidtion in filer || ")

    employee.filter($"state".equalTo("IL") || $"state".equalTo("AZ")).show()

    println("*** multi contidtion in filer &&  ")

    employee.filter($"state".equalTo("AZ") && $"zip".equalTo("60173")).show()

  }
}

1
投票

在spark / scala中,使用varargs进行过滤非常容易。

val d = spark.read...//data contains column named matid
val ids = Seq("BNBEL0608AH", "BNBEL00608H")
val filtered = d.filter($"matid".isin(ids:_*))

1
投票
df2 = df1.filter("Status=2")
     .filter("Status=3");

0
投票

在java spark数据集中,它可以用作

数据集userfilter = user.filter(col(“gender”)。isin(“male”,“female”));


0
投票
df2 = df1.filter("Status = 2 OR Status = 3")

为我工作。

© www.soinside.com 2019 - 2024. All rights reserved.