2016-12-26 55 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表达式的参数列表使用括号。这个:

  • 对一个参数没有影响。
  • 拥有超过一个参数:

相关问题