6
votes

Apache Spark démarre avec une expression SQL

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?.


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

6
votes

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>


0 commentaires

3
votes

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


0 commentaires