首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyspark sql-函数中数据的忽略过滤

问Pyspark sql-函数中数据的忽略过滤
EN

Stack Overflow用户
提问于 2019-08-12 07:06:47
回答 1查看 151关注 0票数 0

早上好,

我有个关于电火花密码的问题。假设我们有这样的数据:

代码语言:javascript
复制
+---------+--------+-------+--------+
| 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的行的最小值。

我想做这件事

代码语言:javascript
复制
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,从而得到了这个数据:

代码语言:javascript
复制
+---------+--------+-------+--------+--------+
| 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|
+---------+--------+-------+--------+--------+

我想得到的数据看起来如下所示:

代码语言:javascript
复制
+---------+--------+-------+--------+--------+
| 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|
+---------+--------+-------+--------+--------+

所以我的问题是:

为什么这不起作用?有哪些替代的实现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 08:54:12

实现您所需的最简单的方法是使用when()而不是df.where()。

从你的例子中取变量-

代码语言:javascript
复制
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的最小值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57456916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档