PySpark UDF不返回预期结果
我有一个包含多个列的DataRicks dataframe和一个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
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。