2015-11-09 3 views
6

Hoffentlich bin ich dumm und das wird einfach sein.Gibt es eine Möglichkeit, ein Feld zu filtern, das in einem Spark-Dataframe mit scala nicht enthalten ist?

Ich habe ein Datenframe mit den Spalten 'URL' und 'Referrer'.

Ich möchte alle Referrer extrahieren, die die Top-Level-Domain 'www.mydomain.com' und 'mydomain.co' enthalten.

kann ich

val filteredDf = unfilteredDf.filter(($"referrer").contains("www.mydomain.")) 

jedoch verwenden diese die URL www.google.co.uk Suche url zieht, die auch meine Web-Domain aus irgendeinem Grund enthält. Gibt es einen Weg, mit scala in Spark, dass ich alles mit google herausfiltern kann, während ich die richtigen Ergebnisse behalte?

Dank

Dean

Antwort

10

Sie Prädikat negieren kann entweder not oder ! so alles, was eine weitere Bedingung hinzuzufügen übrig bleibt, ist:

import org.apache.spark.sql.functions.not 

df.where($"referrer".contains("www.mydomain.") && 
    not($"referrer".contains("google"))) 

oder separate Filter:

df 
.where($"referrer".contains("www.mydomain.")) 
.where(!$"referrer".contains("google")) 
+0

Es war der! $ "Referrer", den ich suchte. Ich hätte es gerade ausprobieren sollen, aber der Ansatz von Monte Carlo zum Programmieren wird langweilig und ich konnte keine Dokumentation darüber finden. Vielen Dank! – Dean

+0

hey! Hilfe !, wie kann man das erreichen, indem man es mit einer Säule vergleicht? wie $ "referrer" .contains ($ "spalte-das-sollte-nicht-übereinstimmen") –

+0

@ zero323 funktioniert das für bestimmte pyspark version, ich erhalte import org.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where (nicht ($ 'DELIV_LOC_DESC'.contains (ausdr))) Import org.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where (nicht ($' DELIV_LOC_DESC'.contains (expr))) ungültige Syntax (, Zeile 1) File "", line 1 import org.apache.spark.sql.functions.not ^ Syntax: ungültige Syntax verwendet –

0

Sie können eineverwenden. Here können Sie eine Referenz für die Verwendung von Regex in Scala finden. Und here Sie können einige Hinweise darüber finden, wie man eine richtige Regex für URLs erstellt.

So in Ihrem Fall haben Sie so etwas wie:

val regex = "PUT_YOUR_REGEX_HERE".r // something like (https?|ftp)://www.mydomain.com?(/[^\s]*)? should work 
val filteredDf = unfilteredDf.filter(regex.findFirstIn(($"referrer")) match { 
    case Some => true 
    case None => false 
}) 

Diese Lösung ein wenig Arbeit erfordert aber ist die sicherste.

+0

Es wird nicht funktionieren. Wenn Sie einen regulären Ausdruck verwenden wollen, haben Sie ein paar Möglichkeiten: 1) 'like' mit SQL, einfacher regulärer Ausdruck, 2) UDF mit Standard-Scala-Regex, 3) konvertieren zu RDD und Filter 'Row'-Objekte – zero323