得到PicklingError:无法pickle <type'function'=“”>:在调用UDF时pyspark中的属性查找__builtin __。函数失败

时间:2016-12-26 16:50:09

标签: python apache-spark pyspark apache-spark-sql user-defined-functions

我正在使用pyspark 2.0。我对波纹管代码的酸洗错误

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()

我怎么能解决这个错误

提前致谢

1 个答案:

答案 0 :(得分: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表达式的参数列表一起使用。这样: