web-dev-qa-db-fra.com

Filtre spark DataFrame sur chaîne contient

J'utilise Spark 1.3. et Spark Avro 1.0. . Je travaille à partir de l'exemple sur la page du référentiel . Ce code suivant fonctionne bien

val df = sqlContext.read.avro("src/test/resources/episodes.avro")
df.filter("doctor > 5").write.avro("/tmp/output")

Mais que faire si j'ai besoin de voir si la chaîne doctor contient une sous-chaîne? Depuis que nous écrivons notre expression à l'intérieur d'une chaîne. Que dois-je faire pour faire un "contient"?

25
Knows Not Much

Vous pouvez utiliser contains (cela fonctionne avec une séquence arbitraire):

df.filter($"foo".contains("bar"))

like (SQL comme avec une expression régulière simple SQL avec _ correspondant à un caractère arbitraire et % correspondant à une séquence arbitraire):

df.filter($"foo".like("bar"))

ou rlike (comme avec expressions régulières Java ):

df.filter($"foo".rlike("bar"))

selon vos besoins. LIKE et RLIKE devraient également fonctionner avec des expressions SQL.

58
zero323

Dans pyspark, la syntaxe SparkSql:

where column_n like 'xyz%'

pourrait ne pas fonctionner.

Utilisation:

where column_n RLIKE '^xyz' 

Cela fonctionne parfaitement bien.

0
Jay1991