我正在嘗試在我的 python 代碼中使用pyspark 。applyInPandas問題是,我要傳遞給它的函式存在于同一個類中,因此它被定義為def func(self, key, df). 這成為一個問題,因為applyInPandas會出錯說我向底層函式傳遞了太多引數(最多它允許 akey和df引數,所以self導致問題)。有沒有辦法解決?
基本目標是并行處理資料幀組上的 pandas 函式。
uj5u.com熱心網友回復:
正如 OP 所提到的,一種方法是只使用@staticmethod,這在某些情況下可能是不可取的。
用于創建 pandas_udf的pyspark 源代碼inspect.getfullargspec().args使用(第 386、436 行),這包括self即使從實體呼叫類方法。我認為這是他們的一個錯誤(也許值得提出票)。
為了克服這個問題,最簡單的方法是使用functools.partial可以幫助更改 argspec 的方法,即洗掉self引數并將 args 的數量恢復為 2。
這是基于呼叫實體方法與直接從類呼叫方法并提供實體作為第一個引數相同的想法(因為描述符魔術):
A.func(A(), *args, **kwargs) == A().func(*args, **kwargs)
在一個具體的例子中,
import functools
import inspect
class A:
def __init__(self, y):
self.y = y
def sum(self, a: int, b: int):
return (a b) * self.y
def x(self):
# calling the method using the class and then supply the self argument
f = functools.partial(A.sum, self)
print(f(1, 2))
print(inspect.getfullargspec(f).args)
A(2).x()
這將列印
6 # can still use 'self.y'
['a', 'b'] # 2 arguments (without 'self')
然后,在 OP 的情況下,可以簡單地對key, df引數執行相同的操作:
class A:
def __init__(self):
...
def func(self, key, df):
...
def x(self):
f = functools.partial(A.func, self)
self.df.groupby(...).applyInPandas(f)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443832.html
上一篇:計算積分
