2015-07-09 2 views
27

Ich möchte eine Spalte auswählen, die einem bestimmten Wert entspricht. Ich mache das in Scala und habe ein paar Probleme.Wie überprüfe ich mit Spark Datareframe ohne SQL Query auf Gleichheit?

Heres mein Code

df.select(df("state")==="TX").show() 

dies gibt den Status Spalte mit Boolesche Werte statt nur TX

Ive versuchte auch

df.select(df("state")=="TX").show() 

aber das funktioniert auch nicht.

Antwort

34

hatte ich das gleiche Problem, und die folgende Syntax für mich gearbeitet:

df.filter(df("state")==="TX").show() 

Ich benutze Spark 1.6.

+1

Dies funktioniert bei mir nicht in 1.6. Ich muss Klammern verwenden, um den Datenrahmen zu unterteilen, z. 'df.filter (df [" state "] ==" TX "). show()' –

+0

dein vorgeschlagenes Format kompiliert nicht für mich. Bist du sicher, dass dfs Typ DataFrame ist? – user3487888

+1

Syntax mit Klammern ist PySpark. Die mit Klammern ist Scala – PinoSan

11

Sie sollten verwenden where, select ist eine Projektion, die die Ausgabe der Anweisung zurückgibt, also warum Sie boolesche Werte erhalten. where ist ein Filter, der die Struktur des Datenrahmens beibehält, aber nur die Daten speichert, in denen der Filter funktioniert. obwohl

Entlang derselben Linie, pro der Dokumentation, können Sie uns das schreiben auf 3 verschiedene Arten

// The following are equivalent: 
peopleDf.filter($"age" > 15) 
peopleDf.where($"age" > 15) 
peopleDf($"age" > 15) 
+0

ich gerade versucht, df.filter ($ "state" == "TX"), das funktioniert nicht. Fehler: Überladener Methodenwertfilter mit Alternativen: (conditionExpr: String) org.apache.spark.sql.DataFrame (condition: org.apache.spark.sql.Column) org.apache.spark.sql.DataFrame kann nicht angewendet werden (Boolean) – Instinct

+0

Dies scheint jedoch zu funktionieren. df.select ("state"). wo (df ("state") === "TX"). count – Instinct

+10

'df.filter ($" state "===" TX ")' sollte funktionieren. Sie müssen das Tripel gleich hier verwenden, das eine Spalte zurückgibt -> https://spark.apache.org/docs/1.3.0/api/scala/index.html#org.apache.spark.sql.Column –

16

Es gibt eine andere einfache SQL-ähnliche Option. Mit Spark 1.6 soll das unten auch funktionieren.

df.filter("state = 'TX'") 

Dies ist eine neue Art der Angabe sql wie Filter. Eine vollständige Liste der unterstützten Operatoren finden Sie in der this Klasse.

6

df.filter($"state" like "T%%") für Pattern-Matching

df.filter($"state" === "TX") oder df.filter("state = 'TX'") für die Gleichstellung

5

die Negation zu bekommen, dies zu tun ...

df.filter(not(..expression..)) 

zB

df.filter(not($"state" === "TX")) 
+1

oder Sie können auch nicht gleich als 'df.filter ($" state "! ==" TX ")' – stevevls

3

Wir können mehrere schreiben Filter/wo Bedingungen in Dataframe.

. Zum Beispiel:

table1_df 
.filter($"Col_1_name" === "buddy") // check for equal to string 
.filter($"Col_2_name" === "A") 
.filter(not($"Col_2_name".contains(" .sql"))) // filter a string which is not relevent 
.filter("Col_2_name is not null") // no null filter 
.take(5).foreach(println) 
0

Arbeitete auf Spark-V2 *

import sqlContext.implicits._ 
df.filter($"state" === "TX") 

wenn Bedarf an einer Variablen verglichen werden (zB var):

import sqlContext.implicits._ 
df.filter($"state" === var) 
Verwandte Themen