Python TypeError:获取了意外的关键字参数

Python TypeError:获取了意外的关键字参数,python,apache-spark,pyspark,apache-spark-sql,user-defined-functions,Python,Apache Spark,Pyspark,Apache Spark Sql,User Defined Functions,下面看似简单的代码引发以下错误: 回溯(最近一次呼叫最后一次): 文件“/home/nirmal/process.py”,第165行,在 “时间差”:f.last(adf[“时间差])。超过(窗口设备行) TypeError:\uuuuu call\uuuuuuuuuuu()获得意外的关键字参数“this\u campaign” 代码: 请问我做错了什么?谢谢。您会遇到一个异常,因为它只支持varargs,不支持关键字args def __call__(self, *cols): sc

下面看似简单的代码引发以下错误:

回溯(最近一次呼叫最后一次):
文件“/home/nirmal/process.py”,第165行,在
“时间差”:f.last(adf[“时间差])。超过(窗口设备行)
TypeError:\uuuuu call\uuuuuuuuuuu()获得意外的关键字参数“this\u campaign”
代码:
请问我做错了什么?谢谢。

您会遇到一个异常,因为它只支持varargs,不支持关键字args

def __call__(self, *cols):
    sc = SparkContext._active_spark_context
    jc = self._judf.apply(_to_seq(sc, cols, _to_java_column))
    return Column(jc)
在更基本的级别上,UDF只能接收
参数,这些参数将在运行时扩展为相应的值,而不是标准的Python对象

就我个人而言,我根本不会为此使用
**kwargs
,但忽略了通过组合SQL表达式可以实现您想要的:

def flag_network_timeout_(**kwargs):

    cond = (
        (kwargs['this_network'] != kwargs['last_network']) |
        (kwargs['this_campaign'] != kwargs['last_campaign']) |
        (kwargs['this_adgroup'] != kwargs['last_adgroup']) |
        (kwargs['this_creative'] != kwargs['last_creative']) |
        (kwargs['time_diff'] > network_timeout))

    return f.when(cond, 1).otherwise(0)

不管是谁投票决定结束这场辩论,你能解释一下这场辩论的范围有多广吗?错误是特定的,代码是特定于错误的。结构不好的问题-不容易searcheable@muon怎么用?标记表示定义所有语言。标题包含确切的错误消息。主体包含问题。这绝对不能保证闭包,“因为UserDefinedFunction.\uuuu call\uuuu只支持varargs而不支持关键字args”。非常感谢。就这样!我不认为我自己会捕捉到它。第二部分更重要,IMHO:)每当你可以在UDF和组合SQL表达式之间进行选择时,前一部分应该始终是你的第一选择。UDF,特别是Python的UDF,有很多丑陋的属性。老实说,我没有得到第二部分。它与UDF有多大的不同?这太棒了!我将所有UDF转换为SQL表达式,结果性能提高了22%(脚本完成时间从44分钟增加到34分钟)。谢谢你的帮助!感谢您指出
只支持varargs,不支持关键字args。
def flag_network_timeout_(**kwargs):

    cond = (
        (kwargs['this_network'] != kwargs['last_network']) |
        (kwargs['this_campaign'] != kwargs['last_campaign']) |
        (kwargs['this_adgroup'] != kwargs['last_adgroup']) |
        (kwargs['this_creative'] != kwargs['last_creative']) |
        (kwargs['time_diff'] > network_timeout))

    return f.when(cond, 1).otherwise(0)