Ответ 1
Вместо:
df2 = df1.filter("Status=2" || "Status =3")
Try:
df2 = df1.filter($"Status" === 2 || $"Status" === 3)
У меня есть кадр данных с четырьмя полями. одно из имени поля - Status, и я пытаюсь использовать условие OR в .filter для фрейма данных. Я попробовал ниже запросы, но не повезло.
df2 = df1.filter(("Status=2") || ("Status =3"))
df2 = df1.filter("Status=2" || "Status =3")
Кто-нибудь использовал это раньше. Я видел аналогичный вопрос о переполнении стека here. Они использовали ниже код для использования условия ИЛИ. Но этот код предназначен для 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")
Try:
df2 = df1.filter($"Status" === 2 || $"Status" === 3)
На этот вопрос дан ответ, но для дальнейшего использования я хотел бы отметить, что в контексте этого вопроса методы where
и filter
в наборе данных /Dataframe поддерживают два синтаксиса: строковые параметры SQL:
df2 = df1.filter(("Status = 2 or Status = 3"))
и параметры на основе Col (упомянутые @David):
df2 = df1.filter($"Status" === 2 || $"Status" === 3)
Похоже, что OP объединил эти два синтаксиса. Лично я предпочитаю первый синтаксис, потому что он чище и более универсален.
Вам нужно использовать фильтр
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()
}
}
В spark/scala его довольно легко фильтровать с помощью varargs.
val d = spark.read...//data contains column named matid
val ids = Seq("BNBEL0608AH", "BNBEL00608H")
val filtered = d.filter($"matid".isin(ids:_*))
df2 = df1.filter("Status=2")
.filter("Status=3");
В наборе данных Java Spark его можно использовать как
Набор данных userfilter = user.filter(col ("пол"). Isin ("мужчина", "женщина"));
df2 = df1.filter("Status = 2 OR Status = 3")
Работал на меня.