web-dev-qa-db-fra.com

Existe-t-il un moyen de filtrer un champ ne contenant pas quelque chose dans un cadre de données spark à l'aide de scala?

Si tout va bien je suis stupide et ce sera facile.

J'ai un dataframe contenant les colonnes 'url' et 'referrer'.

Je souhaite extraire tous les référents contenant le domaine de premier niveau "www.mondomaine.com" et "mydomain.co".

Je peux utiliser

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

Toutefois, cette opération extrait l'URL de recherche www.google.co.uk qui contient également mon domaine Web pour une raison quelconque. Existe-t-il un moyen, en utilisant scala in spark, de filtrer tout ce que contient Google tout en conservant les résultats corrects que j'ai?

Merci

Doyen

7
Dean

Vous pouvez annuler le prédicat à l'aide de not ou ! afin qu'il ne reste plus qu'à ajouter une autre condition:

import org.Apache.spark.sql.functions.not

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

ou filtre séparé:

df
 .where($"referrer".contains("www.mydomain."))
 .where(!$"referrer".contains("google"))
15
zero323

Vous pouvez utiliser une Regex. Ici vous pouvez trouver une référence pour l’utilisation de regex dans Scala. Et ici vous pouvez trouver quelques astuces sur la création d’une expression rationnelle appropriée pour les URL.

Ainsi, dans votre cas, vous aurez quelque chose comme:

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

Cette solution nécessite un peu de travail mais est la plus sûre.

0
mgaido