我试图理解您需要在哪里使用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()))