【问题标题】:Where do you need to use lit() in Pyspark SQL?在 Pyspark SQL 中,您需要在哪里使用 lit()?
【发布时间】:2016-10-09 11:06:54
【问题描述】:

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

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

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

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

有没有什么地方可以让我更好地学习何时使用litcol 的硬性规则?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

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

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

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

    col("foo") > 0  # OK
    

    或者值必须用文字包装:

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

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

    0 < col("foo") 
    

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

    不言而喻,如果您想访问any of the pyspark.sql.Column methods,则必须使用lit,将标准Python 标量视为a constant column。例如,您需要

    c = lit(1)
    

    不是

    c = 1
    

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

    【讨论】:

    • 我知道这违反了 SO“协议”,但我只想对您为 Spark 社区提供的许多好的答案表示感谢。在许多方面,文档让人感觉不完整或支离破碎,因此拥有源专家是天赐之物。
    【解决方案2】:

    导入库:

    from pyspark.sql.functions import lit
    

    简单的例子可以是:

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

    例如:

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

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 2015-10-19
      • 2011-07-18
      • 2018-02-21
      • 2012-11-18
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多