繁体   English   中英

如何将常量值传递给 Python UDF?

[英]How to pass a constant value to Python UDF?

我在想是否可以创建一个UDF ,它接收两个参数Column和另一个变量( ObjectDictionary或任何其他类型),然后执行一些操作并返回结果。

实际上,我试图这样做,但我得到了一个例外。 因此,我想知道是否有任何方法可以避免这个问题。

df = sqlContext.createDataFrame([("Bonsanto", 20, 2000.00), 
                                 ("Hayek", 60, 3000.00), 
                                 ("Mises", 60, 1000.0)], 
                                ["name", "age", "balance"])

comparatorUDF = udf(lambda c, n: c == n, BooleanType())

df.where(comparatorUDF(col("name"), "Bonsanto")).show()

我收到以下错误:

AnalysisException: u"无法解析给定输入列名称、年龄、余额的 'Bonsanto';"

所以很明显, UDFstring “Bonsanto”“视为”列名,实际上我正在尝试将记录值与第二个参数进行比较。

另一方面,我知道可以在where子句中使用一些运算符(但实际上我想知道它是否可以使用UDF实现),如下所示:

df.where(col("name") == "Bonsanto").show()

#+--------+---+-------+
#|    name|age|balance|
#+--------+---+-------+
#|Bonsanto| 20| 2000.0|
#+--------+---+-------+

传递给 UDF 的所有内容都被解释为列/列名称。 如果你想传递一个文字,你有两个选择:

  1. 使用柯里化传递参数:

     def comparatorUDF(n): return udf(lambda c: c == n, BooleanType()) df.where(comparatorUDF("Bonsanto")(col("name")))

    只要它是可序列化的,它就可以与任何类型的参数一起使用。

  2. 使用 SQL 文字和当前实现:

     from pyspark.sql.functions import lit df.where(comparatorUDF(col("name"), lit("Bonsanto")))

    这仅适用于支持的类型(字符串、数字、布尔值)。 对于非原子类型,请参阅如何在 Spark DataFrame 中添加常量列?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM