Pyspark UDF - TypeError:“模块”对象不可调用

Posted

技术标签:

【中文标题】Pyspark UDF - TypeError:“模块”对象不可调用【英文标题】:Pyspark UDF - TypeError: 'module' object is not callable 【发布时间】:2019-03-01 08:37:16 【问题描述】:

我正在尝试根据我在网上找到的一些教程运行以下代码:

import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql import functions
from pyspark.sql import udf
df_pd = pd.DataFrame(
data='integers': [1, 2, 3],
 'floats': [-1.0, 0.5, 2.7],
 'integer_arrays': [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
)

df = spark.createDataFrame(df_pd)
df.show()

def square(x):
    return x**2
from pyspark.sql.types import IntegerType
square_udf_int = udf(lambda z: square(z), IntegerType())

但是当我运行最后一行时,出现以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable

我在 Hadoop 2.7 上使用 spark 2.3.3。

谢谢

【问题讨论】:

你是怎么调用udf函数的!你能告诉我吗? @RAMSHANKERG 我真的不明白你的意思,在错误之前的最后一行,因为我的消息说我正在尝试将我的函数转换为 UDF,这就是我正在运行的所有代码错误 square_udf_int = udf(lambda z: square(z), IntegerType()) 你不应该通过调用 square_udf_int 函数向 z 发送一些值吗? @RAMSHANKERG 是的,当我打电话给 UDF 时;但声明时代码失败 包括完整的回溯,显示导致错误的确切代码。在某个地方你有一个不属于你的() 【参考方案1】:

您似乎是从 pyspark.sql 导入的,而它应该是 pyspark.sql.functions 喜欢...

import pyspark.sql.functions as F

     udf_fun = F.udf (lambda..., Type())

【讨论】:

【参考方案2】:

似乎您正在调用 UDF 非pythonic 方式。缩进在 python 中是至关重要的。我做了以下更改,效果很好

import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql import functions
from pyspark.sql import udf
df_pd = pd.DataFrame(
data='integers': [1, 2, 3],
 'floats': [-1.0, 0.5, 2.7],
 'integer_arrays': [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
)

df = spark.createDataFrame(df_pd)
df.show()

def square(x):
    return x**2

def call_udf():
  from pyspark.sql.types import IntegerType
  square_udf_int = udf(lambda z: square(z), IntegerType())

【讨论】:

以上是关于Pyspark UDF - TypeError:“模块”对象不可调用的主要内容,如果未能解决你的问题,请参考以下文章

PySpark。将 Dataframe 传递给 pandas_udf 并返回一个系列

如何在 pyspark.sql.functions.pandas_udf 和 pyspark.sql.functions.udf 之间进行选择?

udf(用户定义函数)如何在 pyspark 中工作?

SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别

在 PySpark 中重新加载 UDF

pyspark 的用户定义函数 (UDF) 是不是需要单元测试?