2017-07-05 40 views
0

我在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' | '++' | 
+-------+-------+-------+------------+ 

誰能幫助我?

+0

您可以添加輸入數據樣本以及您期望的輸出嗎? – Duf59

+0

我用Duf59所說的例子編輯了這個問題。 – jartymcfly

回答

0

難道你不能簡化和使用這樣一個單一的udf(如果需要,method1可以採取多個列)? :

def method1(x): 
    if x != "-": 
    return x 
    else: 
    return 'other' 

u_method1 = udf(method1, StringType()) 

result = df.withColumn("new_column", u_method1("ATR1")) 
相關問題