PySpark UDF不返回预期结果

PySpark UDF不返回预期结果,pyspark,azure-databricks,Pyspark,Azure Databricks,我有一个包含多个列的DataRicks dataframe和一个UDF,它根据其他列的值生成新列的内容 原始数据集的一个示例是: interval_group_id control_value pulse_value device_timestamp 2797895314 5 5 2020-09-12 09:08:44 0 5

我有一个包含多个列的DataRicks dataframe和一个UDF,它根据其他列的值生成新列的内容

原始数据集的一个示例是:

interval_group_id     control_value     pulse_value     device_timestamp

2797895314            5                 5               2020-09-12 09:08:44
0                     5                 5               2020-09-12 09:08:45
0                     6                 5               2020-09-12 09:08:46
0                     0                 5               2020-09-12 09:08:47
现在,我尝试添加一个新列,名为
group\u id
,它基于上述列的一些逻辑。我的自定义项代码是:

@udf('integer')
def udf_calculate_group_id_new (interval_group_id, prev_interval_group_id, control_val, pulse_val):
  
  if interval_group_id != 0:
    return interval_group_id
  elif control_val >= pulse_val and prev_interval_group_id != 0:
    return prev_interval_group_id
  else:
    return -1
添加到我的数据框中的新列是通过以下方式完成的:

df = df.withColumn('group_id'
                   , udf_calculate_group_id_new(
                          df.interval_group_id                                                   
                          , lag(col('interval_group_id')).over(Window.orderBy('device_timestamp'))            
                          , df.control_value
                          , df.pulse_value)
                  )

我的预期结果是:

interval_group_id    control_value    pulse_value   device_timestamp       group_id

2797895314           5                5             2020-09-12 09:08:44    2797895314
0                    5                5             2020-09-12 09:08:45    2797895314
0                    6                5             2020-09-12 09:08:46    2797895314
0                    0                5             2020-09-12 09:08:47    -1
但是,添加新的
组id
列的结果如下:

interval_group_id    control_value    pulse_value   device_timestamp       group_id

2797895314           5                5             2020-09-12 09:08:44    null
0                    5                5             2020-09-12 09:08:45    null
0                    6                5             2020-09-12 09:08:46    -1
0                    0                5             2020-09-12 09:08:47    -1
我的目标是根据上述条件,将值
2797895314
向下传播到
组id
列,但不知何故,这并没有发生,结果被错误地填充为
null
-1


这是UDF的错误还是我对UDF工作方式的期望不正确?或者我只是不擅长编码?

查看udf代码,我认为在您的示例数据中,
device\u timestamp列
缺失。此外,
interval\u group\u id
列可能应命名为
interval\u group\u id\u start
?@werner是所用列的名称和UDF的参数是否匹配?否,不是UDF函数的参数名称。但是在
withColumn
调用中调用udf时使用的列名应该出现在dataframe@werner哦,我的错。。这是我的问题中的一个输入错误,出于保密协议的考虑,我不得不重新命名一些列,我无法决定列的名称:)我会修正它,只是让它们匹配。另外,
device\u timestamp
应该是不言自明的,但是我用示例数据添加了它,这样逻辑就清楚了。有两件事:1.)你能尝试用
@udf('integer')
替换
@udf('long')
?2.)您看到的两个
-1
在我看来是正确的:您检查
prev\u interval\u group\u id!=0
并且该条件对于第3行和第4行为false,因此结果为-1。