【问题标题】:Use of lit() in expr()在 expr() 中使用 lit()
【发布时间】:2019-04-11 12:59:45
【问题描述】:

行:

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

按预期工作,但是

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

产生以下异常:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    或者不用expr直接使用内置的Sparkconcat函数:

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

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

    【讨论】:

    • 但是如何使用expr编写以下内容? df.withColumn("test", concat($"lon", lit(" a nonColumn string"))
    • @MehrdadAP:当使用expr 连接常量字符串时,您可以简单地使用单引号。使用expr 的示例的等价物是:df.withColumn("test", expr("concat(lon, ' a nonColumn string')"))
    猜你喜欢
    • 2021-04-10
    • 2022-09-13
    • 1970-01-01
    • 2019-10-24
    • 2021-08-01
    • 2021-01-01
    • 1970-01-01
    • 2020-10-26
    • 2016-10-09
    相关资源
    最近更新 更多