2015-11-09 3 views
6

Speriamo di essere stupido e sarà facile.C'è un modo per filtrare un campo che non contiene qualcosa in un dataframe di scintilla usando scala?

Ho un dataframe che contiene l'url e il referrer delle colonne.

Voglio estrarre tutti i referrer che contengono il dominio di primo livello "www.mydomain.com" e "mydomain.co".

posso usare

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

Tuttavia, questo tira fuori l'url www.google.co.uk di ricerca URL che contiene anche il mio dominio web per qualche motivo. C'è un modo, usando scala in spark, che io possa filtrare qualsiasi cosa con google in esso mantenendo i risultati corretti che ho?

Grazie

Dean

risposta

10

È possibile negare predicato utilizzando not o ! quindi tutto quello che è rimasto è quello di aggiungere un'altra condizione:

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

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

o filtro separato:

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

Era il! $ "Referrer" che stavo cercando. Avrei dovuto provarlo ma l'approccio di monte carlo alla codifica diventa noioso e non sono riuscito a trovare alcuna documentazione a riguardo. Grazie! – Dean

+0

ehi! aiuto !, un modo per raggiungere questo risultato confrontando una colonna? come $ "referrer" .contains ($ "colonna-che-shouldnt-match") –

+0

@ zero323 fa questo lavoro per la versione specifica pyspark, sto ottenendo importazione org.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where (non ($ 'DELIV_LOC_DESC'.contains (espressione))) importazione org.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where (non ($' DELIV_LOC_DESC'.contains (espressione))) sintassi non valida (, linea 1) File "", la linea 1 importazione org.apache.spark.sql.functions.not ^ SyntaxError: invalid syntax –

0

È possibile utilizzare uno Regex. Here puoi trovare un riferimento per l'uso della regex in Scala. E here puoi trovare alcuni suggerimenti su come creare un'espressione regolare per gli URL.

Così, nel vostro caso si avrà qualcosa di simile:

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 
}) 

Questa soluzione richiede un po 'di lavoro, ma è la più sicura.

+0

Non funzionerà. Se vuoi usare l'espressione regolare hai alcune opzioni: 1) 'like' con espressione regolare semplice SQL, 2) UDF con regex standard di Scala, 3) converti in RDD e filtra gli oggetti' Row' – zero323