早上好,
我有个关于电火花密码的问题。假设我们有这样的数据:
+---------+--------+-------+--------+
| p_key_1 | p_key_2| status| value_1|
+---------+--------+-------+--------+
| 13| 42| True| 33|
| 13| 42| True| 12|
| 13| 42| True| 106|
| 13| 42| False| 0|
| 13| 42| False| 27|
+---------+--------+-------+--------+p_key_1和p_key_1是分区键,但是为了使这个示例更小,我没有改变它们。
通过两个p_keys进行分区,我想添加一个列,其中包含value_1对所有带有status = True的行的最小值。
我想做这件事
my_win= Window.partitionBy('p_key_1', 'p_key_2')
my_df.withColumn('new_col', F.min(my_df.where(F.col('status') == True).value_1).over(my_win))我的问题是,F.min(...)函数中的筛选被完全忽略了,因此new_col的所有值最终都为0,从而得到了这个数据:
+---------+--------+-------+--------+--------+
| p_key_1 | p_key_2| status| value_1| new_col|
+---------+--------+-------+--------+--------+
| 13| 42| True| 33| 12|
| 13| 42| True| 12| 12|
| 13| 42| True| 106| 12|
| 13| 42| False| 0| 12|
| 13| 42| False| 27| 12|
+---------+--------+-------+--------+--------+我想得到的数据看起来如下所示:
+---------+--------+-------+--------+--------+
| p_key_1 | p_key_2| status| value_1| new_col|
+---------+--------+-------+--------+--------+
| 13| 42| True| 33| 0|
| 13| 42| True| 12| 0|
| 13| 42| True| 106| 0|
| 13| 42| False| 0| 0|
| 13| 42| False| 27| 0|
+---------+--------+-------+--------+--------+所以我的问题是:
为什么这不起作用?有哪些替代的实现?
发布于 2019-08-12 08:54:12
实现您所需的最简单的方法是使用when()而不是df.where()。
从你的例子中取变量-
my_win = Window.partitionBy('p_key_1', 'p_key_2') # your window spec
my_df.withColumn('new_col', F.min(F.when(F.col('status') == True), F.col(value_1)).over(my_win))只有当new_col字段是True字段时,status字段才会给出字段value_1的最小值。
https://stackoverflow.com/questions/57456916
复制相似问题