首页 文章

如何在Pyspark中注册没有参数的UDF

提问于
浏览
1

我已经尝试使用lambda函数的参数spark UDF并注册它 . 但我怎么能创建没有参数和注册商的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()函数的代码谢谢

3 回答

  • 1
    • lambda 表达式可以是无效的 . 你只是使用不正确的语法:
    spark.udf.register('GATE_TIME', lambda: getTime(), TimestampType())
    
    • 在Spark的上下文中 lambda 表达式没有什么特别之处 . 您可以直接使用 getTime
    spark.udf.register('GetTime', getTime, TimestampType())
    
    • 根本不需要效率低下的 udf . Spark提供了开箱即用的所需功能:
    spark.sql("SELECT current_timestamp()")
    

    要么

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

    错误“ NameError: name 'TimestampType' is not defined ”似乎是由于缺少:

    import pyspark.sql.types.TimestampType
    

    有关 TimeStampType 的更多信息,请参阅此答案https://stackoverflow.com/a/30992905/5088142

  • 2

    我在这里做了一些调整,它现在运行良好

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

    而不是当前时间任何值都可以通过它将在这里给出当前日期时间

相关问题