在expr()中使用lit()

时间:2018-11-08 02:17:58

标签: scala apache-spark apache-spark-sql databricks

该行:

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

按预期工作,但

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

产生以下异常:

  

org.apache.spark.sql.AnalysisException:未定义的函数:'lit'。该功能既不是注册的临时功能,也不是在数据库“默认”中注册的永久功能。第1行pos 12           在org.apache.spark.sql.catalyst.analysis.Analyzer $ LookupFunctions $$ anonfun $ apply $ 15 $ anonfun $ applyOrElse $ 49.apply(Analyzer.scala:1198)

为什么?解决方法是什么?

1 个答案:

答案 0 :(得分:2)

expr的字符串参数将被解析为SQL表达式,并用于构造列。由于lit不是有效的SQL命令,因此会给您一个错误。

要解决此问题,只需删除lit部分:

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

或者直接使用内置的Spark concat函数而不使用expr

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

由于concat将列用作参数lit,因此必须在此处使用。