在 Pyspark SQL 中哪里需要使用 lit()?



我试图理解您需要在哪里使用lit值,该值在文档中定义为literal column

以这个udf为例,它返回一个 SQL 列数组的索引:

def find_index(column, index):
return column[index]

如果我将一个整数传入其中,我会得到一个错误。 我需要将一个lit(n)值传递到 udf 中才能获得数组的正确索引。

有没有一个地方可以更好地学习何时使用lit以及可能col的硬性规定?

为了简单起见,当 JVM 对应方需要一列并且 Python 包装器中没有内部转换时,或者您想调用Column特定方法时,您需要一个Column(可以是使用lit创建的,但它不是唯一的选择)。

在第一种情况下,唯一严格的规则是适用于 UDF 的 on。UDF(Python或JVM)只能使用Column类型的参数调用。它通常也适用于pyspark.sql.functions中的函数。在其他情况下,最好先检查文档和文档字符串,如果没有足够的相应 Scala 对应项的文档。

在第二种情况下,规则很简单。例如,如果要将列与值进行比较,则值必须位于 RHS 上:

col("foo") > 0  # OK

或者值必须用文字包装:

lit(0) < col("foo")  # OK

在Python中,许多运算符(<==<=&|+-*/)可以在LHS上使用非列对象:

0 < col("foo") 

但 Scala 不支持此类应用程序。

不言而喻,如果要访问任何将标准 Python 标量视为常量列的pyspark.sql.Column方法,则必须使用lit。例如,您将需要

c = lit(1)

c = 1

c.between(0, 3)  # type: pyspark.sql.Column

导入库:

from pyspark.sql.functions import lit

简单的例子可以是:

df.withColumn("columnName", lit(Column_Value ))

前任:

df = df.withColumn("Today's Date", lit(datetime.now()))

相关内容

  • 没有找到相关文章

最新更新