我有一个包含四个字段的数据框。其中一个字段名称是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()
答案 0 :(得分:34)
而不是:
df2 = df1.filter("Status=2" || "Status =3")
尝试:
df2 = df1.filter($"Status" === 2 || $"Status" === 3)
答案 1 :(得分:5)
如果我们想要部分匹配,就像包含,我们可以像下面这样链接包含调用:
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)
}
答案 2 :(得分:4)
这个问题已经得到解答,但为了将来参考,我想提一下,在这个问题的上下文中,数据集/数据帧中的where
和filter
方法支持两种语法:
SQL字符串参数:
df2 = df1.filter(("Status = 2 or Status = 3"))
和基于Col的参数(由@David提及):
df2 = df1.filter($"Status" === 2 || $"Status" === 3)
似乎OP'd结合了这两种语法。 就个人而言,我更喜欢第一种语法,因为它更干净,更通用。
答案 3 :(得分:1)
您需要使用过滤器
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()
}
}
答案 4 :(得分: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:_*))
答案 5 :(得分:1)
df2 = df1.filter("Status=2")
.filter("Status=3");
答案 6 :(得分:0)
在java spark数据集中,它可用作
数据集userfilter = user.filter(col(“ gender”)。isin(“ male”,“ female”));
答案 7 :(得分:0)
(?ims)SELECT.+FROM\\s+(\\w+)\\W"
为我工作。
答案 8 :(得分:0)
另一种方法是将函数expr与where子句一起使用
import org.apache.spark.sql.functions.expr
df2 = df1.where(expr("col1 = 'value1' and col2 = 'value2'"))
工作原理相同。
答案 9 :(得分:0)
您可以尝试,(使用1个对象(例如列表或一组值)进行过滤
ds = ds.filter(functions.col(COL_NAME).isin(myList));
或按照@Tony Fraser的建议,您可以尝试(带有一定数量的对象)
ds = ds.filter(functions.col(COL_NAME).isin(mySeq));
所有答案都是正确的,但大多数答案并不代表良好的编码风格。此外,即使将来参数在某个时间点是静态的,也应始终考虑它们的可变长度。
答案 10 :(得分:0)
供将来参考:
我们可以使用 isInCollection
进行过滤,下面是一个示例:
注意:它将查找完全匹配
def getSelectedTablesRows(allTablesInfoDF: DataFrame, tableNames: Seq[String]): DataFrame = {
allTablesInfoDF.where(col("table_name").isInCollection(tableNames))
}