在expr()中使用lit()

Kyu*_*nam 6 scala apache-spark apache-spark-sql databricks

该行:

df.withColumn("test", expr("concat(lon, lat)")) 
Run Code Online (Sandbox Code Playgroud)

可以正常工作,但是

df.withColumn("test", expr("concat(lon, lit(','), lat)"))
Run Code Online (Sandbox Code Playgroud)

产生以下异常:

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

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

Sha*_*ica 6

字符串参数 toexpr将被解析为 SQL 表达式并用于构造列。由于lit不是有效的 SQL 命令,这会给您一个错误。(lit在 Spark 中用于将文字值转换为新列。)

要解决这个问题,只需移除lit零件:

df.withColumn("test", expr("concat(lon, ',', lat)")) 
Run Code Online (Sandbox Code Playgroud)

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

df.withColumn("test", concat($"lon", lit(","), $"lat"))
Run Code Online (Sandbox Code Playgroud)

由于这里必须使用concat以列作为参数lit