当前位置: 首页 > 知识库问答 >
问题:

使用来自 Python 类的方法作为 PySpark 用户定义函数

赵高雅
2023-03-14

我正在尝试编写一个Python实用函数,它接受本地定义类的对象,并在PySpark DataFrame<code>withColumn<code>调用中使用该类的一个方法作为用户定义函数(UDF)。实用功能签名为:

 def spark_analyze(lp: LogProcessor):

LogProcess类中,我有一个想用作UDF的方法。方法定义是:

schema = StructType([
  StructField("total", IntegerType(), False),
  StructField("other", IntegerType(), False)
])

def ProcessLog(self, log_file):
    self.PrepareForLog()
    for event in pyspark_utils.spark_events_from_file(log_file):
      self.ProcessEvent(event)
      return [total, other]

在< code>spark_analyze中,我执行以下操作,其中< code>lp是传入的< code>LogProcessor类型的对象:

@udf(lp.schema)
def lpf(lcm_file):
    lp.ProcessLog(lcm_file)
return (df.withColumn('results', lpf(col('logfile_dir')))
...

生成一个很长的 Python 堆栈跟踪,其开始如下所示:

spark_analyze(lp)中的/home/David/libs . zip/py spark _ utils . py 132 def LPF(LCM _ file):133 LP。进程日志(lcm_file)

/usr/HDP/current/spark 2-client/python/lib/py spark . zip/py spark/SQL/functions . py in wrapper(* args)1955 @ functools . wrappers(f)1956 def wrapper(* args):-

并以以下内容结尾:

spark_analyze(lp)中的/home/David/libs . zip/py spark _ utils . py 132 def LPF(LCM _ file):133 LP。进程日志(lcm_file)

/usr/HDP/current/spark 2-client/python/lib/py spark . zip/py spark/SQL/functions . py in wrapper(* args)1955 @ functools . wrappers(f)1956 def wrapper(* args):-

我做了一些测试,发现如果我在传递给col的位置上方定义了我的UDF,事情就会很好。我还尝试将<code>ProcessLog,发现问题并没有消失。因此,问题似乎是我使用传入类对象的方法作为UDF。还有其他方法可以让UDF成为类中的方法吗?谢谢你的帮助!

共有1个答案

方季同
2023-03-14

奥斯曼·阿兹哈尔建议的方法可能行得通。我通过简单地将UDF的定义作为库函数的参数来解决这个问题。

 类似资料:
  • 本文向大家介绍python调用matlab的m自定义函数方法,包括了python调用matlab的m自定义函数方法的使用技巧和注意事项,需要的朋友参考一下 项目信号处理和提取部分用到了matlab,需要应用到工程中方便研究。用具有万能粘合剂之称的“Python”。具体方法如下: 1.python中安装mlab 下载https://pypi.python.org/pypi/mlab 安装命令:pyt

  • 主要内容:函数定义函数是一组可重复使用的代码,可以在程序中的任何地方调用。这消除了一遍又一遍地编写相同的代码的需要。这使程序员能够将一个大程序划分成许多小的可管理的功能模块。 除了内置函数外,VBA还允许编写用户定义的函数。 在本章中,我们将学习如何在VBA中编写自己的函数。 函数定义 一个VBA函数可以有一个可选的语句。如果要从函数返回值,则可使用语句。 例如,可以在一个函数中传递两个数字,然后从函数中返回它们的

  • 问题内容: 我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量… 例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 040011”。 我无法更改这些值- 它们通过他们的公司存在,已经在州,客户等中注册。我知道将年份和其余年份分隔到单独的列中会很好,但这是不可能的。我什至不能真正做到“内部”,因为每一

  • 我有一个自定义endpoint,如下所示: 当回调函数不是基于类的方法时,我能够调用回调函数“get_user_lang”。但是一旦我将其转换为基于类的方法,我就无法调用它。 我的班级是这样的: 我的新endpoint如下所示: 有人知道如何在WordPress Rest API自定义endpoint中调用基于类的方法吗?

  • 本文向大家介绍python调用自定义函数的实例操作,包括了python调用自定义函数的实例操作的使用技巧和注意事项,需要的朋友参考一下 在python中,想要调用自定义函数必须先声明,然后才能调用。使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果。 (1)声明函数 python中使用 def 可以声明一个函数,完整的函数是由函数名、参

  • 问题内容: 我想使用该函数在滚动窗口的基础上应用自己的自定义函数。 但是我的函数需要两个参数,并且还具有两个输出。这可能吗? 下面是一个最小的可复制示例… 导致错误…因为gm需要两个参数… 任何帮助将不胜感激… 编辑 按照Jeff的评论,我已经取得了进步,但仍在为两个或多个列输出而苦苦挣扎,因此,如果我改为创建一个新函数(如下),该函数仅返回两个随机数(与上一个计算无关),而不是v的最后一行,出现