我在Pyspark中創建一個小程序,在該程序中,我想要生成一個使用的定義函數,將lambda函數的'method1'調用爲'method0'。嘗試在數據框上執行Pyspark中的用戶定義函數時出錯
我簡化了代碼以獲得更好的理解,但核心功能是:對於數據框中的每個實例,'method0'應用'method1'(藉助lambda函數)返回值正在檢查的實例的值有。這樣,如果符合'method1'的第一個條件,則該實例的值應該是' - ',但如果不是,它應該是'other'。
通過這些操作,我們的想法是從該UDF獲取一列並將其附加到'method0'中的數據框。下面是修改後的代碼爲你更容易理解:
def method1(atr_list, instance, ident):
if(instance.ATR1 != '-'):
return instance.ATR1
else:
# Other operations ...
return 'other'
def method0(df, atr_example_list, ident):
udf_func = udf(lambda instance: method1(atr_example_list, instance, ident), returnType=StringType())
new_column = udf_func(df)
df = df.withColumnRenamed("New_Column", new_column)
return df
result = method0(df, list, "1111")
但是,當我執行此代碼,我得到了一個錯誤,我真的不知道爲什麼:
Py4JError: An error occurred while calling o298.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
at
py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
at
py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
at py4j.Gateway.invoke(Gateway.java:272)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:214)
at java.lang.Thread.run(Thread.java:748)
這裏是一個示例輸入和輸出的我期望:
數據幀 'DF':
+-------+-------+-------+
| ATR1 | ATR2 | ATRN |
+-------+-------+-------+
| '-' | 1 | 'a' |
| '-' | 1 | 'a' |
| '-' | 2 | 'b' |
| '++' | 1 | 'a' |
+-------+-------+-------+
跑過datafr ame'df'作爲'method0'的參數(對於這個簡化的示例,不需要查看參數'atr_example_list'和'ident')我想在'method1'上調用以下這樣的列:
+------------+
| new_column |
+------------+
| 'other' |
| 'other' |
| 'other' |
| '++' |
+------------+
於是就method0,新的數據幀將是:
+-------+-------+-------+------------+
| ATR1 | ATR2 | ATRN | new_column |
+-------+-------+-------+------------+
| '-' | 1 | 'a' | 'other' |
| '-' | 1 | 'a' | 'other' |
| '-' | 2 | 'b' | 'other' |
| '++' | 1 | 'a' | '++' |
+-------+-------+-------+------------+
誰能幫助我?
您可以添加輸入數據樣本以及您期望的輸出嗎? – Duf59
我用Duf59所說的例子編輯了這個問題。 – jartymcfly