Apache spark spark数据帧中滤波器的多个条件

Apache spark spark数据帧中滤波器的多个条件,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我有一个有四个字段的数据框。其中一个字段名是Status,我正在尝试在数据帧的.filter中使用OR条件。我试过下面的问题,但没有成功 df2 = df1.filter(("Status=2") || ("Status =3")) df2 = df1.filter("Status=2" || "Status =3") 以前有人用过这个吗。我在堆栈溢出上看到了类似的问题。他们使用了以下代码来使用或调节。但这是pyspark的代码 from pyspark.sql.functions impo

我有一个有四个字段的数据框。其中一个字段名是Status,我正在尝试在数据帧的.filter中使用OR条件。我试过下面的问题,但没有成功

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

df2 = df1.filter("Status=2" || "Status =3")
以前有人用过这个吗。我在堆栈溢出上看到了类似的问题。他们使用了以下代码来使用或调节。但这是pyspark的代码

from pyspark.sql.functions import col 

numeric_filtered = df.where(
(col('LOW')    != 'null') | 
(col('NORMAL') != 'null') |
(col('HIGH')   != 'null'))
numeric_filtered.show()
而不是:

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


你需要使用过滤器

package dataframe

import org.apache.spark.sql.SparkSession
/**
 * @author vaquar.khan@gmail.com
 */
//

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()

  }
}

这个问题已经得到了回答,但为了将来的参考,我想在这个问题的上下文中提到,Dataset/Dataframe中的
where
filter
方法支持两种语法: SQL字符串参数:

df2 = df1.filter(("Status = 2 or Status = 3"))
和基于Col的参数(由提及):

似乎OP将这两种语法结合起来了。
就个人而言,我更喜欢第一种语法,因为它更简洁、更通用。

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

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

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

数据集userfilter=user.filter(col(“性别”).isin(“男性”、“女性”)


为我工作。

另一种方法是将函数expr与where子句一起使用

import org.apache.spark.sql.functions.expr

df2 = df1.where(expr("col1 = 'value1' and col2 = 'value2'"))
它的工作原理相同。

您可以尝试(使用一个对象(如列表或一组值)进行过滤)

或者正如@Tony Fraser所建议的,您可以尝试(使用一系列对象)

所有答案都是正确的,但大多数答案并不代表良好的编码风格。此外,您应该总是考虑将来的变量长度,即使它们在某个时间点是静态的。 我们可以使用
isInCollection
进行过滤,下面是一个示例: 注意:它将查找精确匹配

  def getSelectedTablesRows(allTablesInfoDF: DataFrame, tableNames: Seq[String]): DataFrame = {

    allTablesInfoDF.where(col("table_name").isInCollection(tableNames))

  }

如果我们想要部分匹配,就像包含,我们可以像这样链接包含调用:

def getSelectedTablesRows2(allTablesInfoDF: DataFrame, tableNames: Seq[String]): DataFrame = {

    val tableFilters = tableNames.map(_.toLowerCase()).map(name => lower(col("table_name")).contains(name))
    val finalFilter = tableFilters.fold(lit(false))((accu, newTableFilter) => accu or newTableFilter)
    allTablesInfoDF.where(finalFilter)

  }

从这一行判断:
scala>来自pyspark.sql.column import column
当您实际使用pyspark代码时,您似乎正在尝试使用pyspark代码scala@TonTorres是的,这是一个错误,我在发布这个问题后意识到了这一点。现在进行编辑。与
=
相反的是
==取决于版本--对于2.0之前的版本,请使用
==但在2.0.0版之后
==的优先级与
==
不同,请使用
==说明如何在Java中过滤多列上的DF。我有类似这样的
df.filter(df.col(“name”).equalTo(“john”))
。我想在一行中的多个列上进行筛选?您可以只添加另一列。在当前列之后进行筛选。df.filter(df.col(“name”).equalTo(“john”).filter(df.col(“name”).equalTo(“tim”)@DavidSchuler这些链式过滤器是否合并到火花分析仪中的单个工作级?这是一个过滤器,而不是一个过滤器。这种情况首先过滤状态为2的数据集,然后过滤状态为3的结果数据集,因此它是和条件,而不是或
df2 = df1.filter("Status = 2 OR Status = 3")
import org.apache.spark.sql.functions.expr

df2 = df1.where(expr("col1 = 'value1' and col2 = 'value2'"))
ds = ds.filter(functions.col(COL_NAME).isin(myList));
ds = ds.filter(functions.col(COL_NAME).isin(mySeq));
  def getSelectedTablesRows(allTablesInfoDF: DataFrame, tableNames: Seq[String]): DataFrame = {

    allTablesInfoDF.where(col("table_name").isInCollection(tableNames))

  }
def getSelectedTablesRows2(allTablesInfoDF: DataFrame, tableNames: Seq[String]): DataFrame = {

    val tableFilters = tableNames.map(_.toLowerCase()).map(name => lower(col("table_name")).contains(name))
    val finalFilter = tableFilters.fold(lit(false))((accu, newTableFilter) => accu or newTableFilter)
    allTablesInfoDF.where(finalFilter)

  }