web-dev-qa-db-fra.com

conditions multiples pour le filtre dans les cadres de données d'allumage

J'ai un cadre de données avec quatre champs. l'un des noms de champ est Status et j'essaie d'utiliser une condition OR dans .filter pour un cadre de données. J'ai essayé ci-dessous des requêtes mais pas de chance.

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

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

Quelqu'un a-t-il déjà utilisé ça avant. J'ai vu une question similaire sur le dépassement de pile ici . Ils ont utilisé le code ci-dessous pour utiliser la condition OR. Mais ce code est pour pyspark.

from pyspark.sql.functions import col 

numeric_filtered = df.where(
(col('LOW')    != 'null') | 
(col('NORMAL') != 'null') |
(col('HIGH')   != 'null'))
numeric_filtered.show()
23
dheee

Au lieu de:

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

Essayer:

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

Nous avons répondu à cette question, mais pour référence future, je voudrais mentionner que, dans le contexte de cette question, les méthodes where et filter de Dataset/Dataframe prennent en charge deux syntaxes: Les paramètres de chaîne SQL:

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

et paramètres basés sur Col (mentionnés par @David ):

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

Il semble que le OP'd ait combiné ces deux syntaxes. Personnellement, je préfère la première syntaxe car elle est plus claire et plus générique.

3
Amin

Vous devez utiliser le filtre 

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
vaquar khan

Dans spark/scala, il est assez facile de filtrer avec varargs.

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