2016-12-26 12 views
1

我正在使用pyspark 2.0。我得到的酸洗錯誤婁代碼PicklingError:Can not pickle <type'function'>:屬性查找__builtin __。在調用UDF時,函數在pyspark中失敗

from pyspark.sql.types import* 
from datetime import datetime 
from pyspark.sql.functions import udf 


def getTime(): 
    timevalue=datetime.now() 
    return timevalue 

spark.udf.register('Getday', getTime,TimestampType()) 

def datetostring_conv(datevalue): 
    stringvalue=datevalue.strftime('%Y-%m-%d') 
    print stringvalue 
    intstring=stringvalue[0:4]+stringvalue[5:7]+stringvalue[8:10] 
    return intstring 

spark.udf.register('IntString',lambda(x):datetostring_conv,StringType()) 

到這個時候我打電話

spark.sql("select date_add(Getday(),-1)as stringtime").show() 

我收到前一天值作爲日期類型,但是當我試圖把它轉換成字符串避免' - '。這是IntString功能的工作我收到酸洗錯誤

spark.sql("select IntString(date_add(GetDay(),1))as stringvalue").show() 

我怎麼能解決這個錯誤

在此先感謝

回答

2

要麼調用該函數:

spark.udf.register('IntString', lambda x: datetostring_conv(x), StringType()) 

或通過功能:

spark.udf.register('IntString', datetostring_conv, StringType()) 

當你使用:

lambda x: datetostring_conv 

你傳遞一個一元函數返回一個函數:

type((lambda x: datetostring_conv)(datetime.now())) 
function 

因此例外。

當然沒有必要對一個UDF:

spark.sql("SELECT date_format(date_add(current_date(), -1), 'YYYYMMdd')") 

注意

你不應該lambda表達式的參數列表使用括號。這個:

  • 對一個參數沒有影響。
  • 擁有超過一個參數:

相關問題