web-dev-qa-db-fra.com

Utilisation de lit () dans expr ()

La ligne:

df.withColumn("test", expr("concat(lon, lat)")) 

fonctionne comme prévu mais

df.withColumn("test", expr("concat(lon, lit(','), lat)"))

produit l'exception suivante:

org.Apache.spark.sql.AnalysisException: fonction non définie: "allumée". Cette fonction n'est ni une fonction temporaire enregistrée ni une fonction permanente enregistrée dans la base de données "par défaut". ligne 1 pos 12 at org.Apache.spark.sql.catalyst.analysis.Analyzer $ LookupFunctions $$ anonfun $ apply $ 15 $ anonfun $ applyOrElse $ 49.apply (Analyzer.scala: 1198)

Pourquoi? Et quelle serait la solution?

6
Kyunam

L'argument chaîne à expr sera analysé comme une expression SQL et utilisé pour construire une colonne. Puisque lit n'est pas une commande SQL valide, cela vous donnera une erreur. (lit est utilisé dans Spark pour convertir une valeur littérale en une nouvelle colonne.)

Pour résoudre ce problème, supprimez simplement la partie lit:

df.withColumn("test", expr("concat(lon, ',', lat)")) 

Ou utilisez la fonction intégrée Spark concat directement sans expr:

df.withColumn("test", concat($"lon", lit(","), $"lat"))

Puisque concat prend des colonnes comme arguments lit doit être utilisé ici.