Pyspark 中的逻辑计数
Logical with count in Pyspark
我是 Pyspark 的新手,我有一个问题要解决。
我有一个包含 4 列的数据框,分别是 customers
、person
、is_online_store
和 count
:
customer
PersonId
is_online_store
count
afabd2d2
4
true
1
afabd2d2
8
true
2
afabd2d2
3
true
1
afabd2d2
2
false
1
afabd2d2
4
false
1
我需要按照以下规则创建:
- 如果
PersonId
count(column) 有 1 或 + Trues 和 None False 那么 Online
- 如果
PersonId
count(column) 有 1 或 + False 和 None True 那么 offline
- 如果
PersonId
count(column) 至少有 1 个 False 和 1 个 True 那么 Hybrid
外观应该如何:
customer
PersonId
New_Column
afabd2d2
4
Hybrid
afabd2d2
8
Online
afabd2d2
3
Online
afabd2d2
2
Offline
按 customer
+ personId
分组并使用 when
表达式检查 is_online_store
列中的所有值是否为 true
/ false
或两者的混合,例如使用 bool_and
函数:
from pyspark.sql import functions as F
df1 = df.groupBy("customer", "PersonId").agg(
F.when(F.expr("bool_and(is_online_store)"), "Online")
.when(F.expr("bool_and(!is_online_store)"), "Offline")
.otherwise("Hybrid").alias("New_Column")
)
df1.show()
#+--------+--------+----------+
#|customer|PersonId|New_Column|
#+--------+--------+----------+
#|afabd2d2| 2| Offline|
#|afabd2d2| 8| Online|
#|afabd2d2| 4| Hybrid|
#|afabd2d2| 3| Online|
#+--------+--------+----------+
我是 Pyspark 的新手,我有一个问题要解决。
我有一个包含 4 列的数据框,分别是 customers
、person
、is_online_store
和 count
:
customer | PersonId | is_online_store | count |
---|---|---|---|
afabd2d2 | 4 | true | 1 |
afabd2d2 | 8 | true | 2 |
afabd2d2 | 3 | true | 1 |
afabd2d2 | 2 | false | 1 |
afabd2d2 | 4 | false | 1 |
我需要按照以下规则创建:
- 如果
PersonId
count(column) 有 1 或 + Trues 和 None False 那么Online
- 如果
PersonId
count(column) 有 1 或 + False 和 None True 那么offline
- 如果
PersonId
count(column) 至少有 1 个 False 和 1 个 True 那么Hybrid
外观应该如何:
customer | PersonId | New_Column |
---|---|---|
afabd2d2 | 4 | Hybrid |
afabd2d2 | 8 | Online |
afabd2d2 | 3 | Online |
afabd2d2 | 2 | Offline |
按 customer
+ personId
分组并使用 when
表达式检查 is_online_store
列中的所有值是否为 true
/ false
或两者的混合,例如使用 bool_and
函数:
from pyspark.sql import functions as F
df1 = df.groupBy("customer", "PersonId").agg(
F.when(F.expr("bool_and(is_online_store)"), "Online")
.when(F.expr("bool_and(!is_online_store)"), "Offline")
.otherwise("Hybrid").alias("New_Column")
)
df1.show()
#+--------+--------+----------+
#|customer|PersonId|New_Column|
#+--------+--------+----------+
#|afabd2d2| 2| Offline|
#|afabd2d2| 8| Online|
#|afabd2d2| 4| Hybrid|
#|afabd2d2| 3| Online|
#+--------+--------+----------+