2016-12-26 81 views
0

我試着用帶lambda函數的參數嘗試spark UDF並註冊它。但我怎麼能創建UDF有沒有爭論和註冊它,我已經試過這是我的示例代碼將有望顯示當前時間如何在Pyspark中無參數地註冊UDF

from datetime import datetime 
    from pyspark.sql.functions import udf 
    def getTime(): 
     timevalue=datetime.now() 
     return timevalue 
    udfGateTime=udf(getTime,TimestampType()) 

但pyspark是顯示

NameError: name 'TimestampType' is not defined 

這可能意味着我的UDF不註冊 我是舒適與此格式

spark.udf.register('GATE_TIME', lambda():getTime(), TimestampType()) 

但lambda函數採取空參數? 。儘管我沒有嘗試,但我有點困惑,請親切地幫助我。我該如何編寫註冊此getTime()函數的代碼感謝

回答

1
  • lambda表達式可以是零元。你僅僅使用不正確的語法:

    spark.udf.register('GATE_TIME', lambda: getTime(), TimestampType()) 
    
  • 中沒有任何lambda表達特殊Spark中的上下文。您可以直接使用getTime

    spark.udf.register('GetTime', getTime, TimestampType()) 
    
  • 沒有必要對低效udf可言。火花提供所需的功能外的現成:

    spark.sql("SELECT current_timestamp()") 
    

    from pyspark.sql.functions import current_timestamp 
    
    spark.range(0, 2).select(current_timestamp()) 
    
0

我已經做了一些調整在這裏和它的運作良好,現在

import datetime 
from pyspark.sql.types import* 

def getTime(): 
    timevalue=datetime.datetime.now() 
    return timevalue 
def GetVal(x): 
    if(True): 
    timevalue=getTime() 
    return timevalue 
spark.udf.register('GetTime', lambda(x):GetVal(x),TimestampType()) 
spark.sql("select GetTime('currenttime')as value ").show() 

代替CURRENTTIME任何值可以通過它會給這裏當前日期時間