Dans l'API Apache Spark, je peux utiliser la fonction startsWith
afin de tester la valeur de la colonne:
myDataFrame.filter(col("columnName").startsWith("PREFIX"))
Est-il possible de faire de même dans Spark SQL expression et si oui, pourriez-vous s'il vous plaît montrer un exemple?.
3 Réponses :
Vous pouvez créer un UDF pour faire cela
myDataFrame.filter(startsWith($"letter")).show +-----------+------+ |letter |number| +-----------+------+ | PREFIXb| 1| +-----------+------+
L'UDF recevra la colonne et la vérifiera par rapport au PREFIX, puis vous pouvez l'utiliser comme suit:
+-----------+------+ |letter |number| +-----------+------+ | PREFIXb| 1| | bPREFIX| 2| +-----------+------+
Si vous voulez un paramètre comme préfixe, vous pouvez avec lit
val startsWith = udf((columnValue: String, prefix:String) => columnValue.startsWith(prefix)) myDataFrame.filter(startsWith($"columnName", lit("PREFIX")))
EXEMPLE DE SAISIE
myDataFrame.filter(startsWith($"columnName"))
EXEMPLE DE SORTIE
import org.apache.spark.sql.functions val startsWith = udf((columnValue: String) => columnValue.startsWith("PREFIX"))
Avec regexp_replace, vous pouvez obtenir les mêmes résultats sans UDF. Vérifiez ceci
scala> df.filter("instr(a,'PREFIX')=1").show +-------+---+ | a| b| +-------+---+ |PREFIXb| 2| +-------+---+ scala>
ou en utilisant regexp_extract ()
scala> df.filter(regexp_extract('a,"""(^PREFIX)""",1)==="PREFIX").show +-------+---+ | a| b| +-------+---+ |PREFIXb| 2| +-------+---+ scala>
En utilisant la fonction instr ()
scala> val df=Seq(("bPREFIX",1),("PREFIXb",2)).toDF("a","b") df: org.apache.spark.sql.DataFrame = [a: string, b: int] scala> df.show +-------+---+ | a| b| +-------+---+ |bPREFIX| 1| |PREFIXb| 2| +-------+---+ scala> df.filter(regexp_replace('a,"""^PREFIX.*""","")==="").show +-------+---+ | a| b| +-------+---+ |PREFIXb| 2| +-------+---+ scala>
J'ai trouvé la solution suivante qui fonctionne avec la requête Spark SQL sans UDP personnalisé et prête à l'emploi, par exemple:
CASE WHEN instr(PRICE_SOURCE_INDICATOR,'MAC') = 1