[英]How to drop column in a condition with groupby in Pyspark
我有一個名為 df 的 dataframe 包含以下內容:
accountname | clustername | namespace | cost
account1 | cluster_1_1 | ns_1_1 | 10
account1 | cluster_1_1 | ns_1_2 | 11
account1 | cluster_1_1 | infra | 12
account1 | cluster_1_2 | infra | 12
account2 | cluster_2_1 | infra | 13
account3 | cluster_3_1 | ns_3_1 | 10
account3 | cluster_3_1 | ns_3_2 | 11
account3 | cluster_3_1 | infra | 12
df 在 accountname 字段的 groupby 中,我需要通過每個 accountname 中的 clustername 字段進行過濾,執行以下操作:當 clustername 中的行對每個 accountname 有多個條目時,刪除 namespace = infra 的行,如果 clustername 中的行在其帳戶名中只有一行,請保留此行,如下所示:
accountname | clustername | namespace | cost
account1 | cluster_1_1 | ns_1_1 | 10
account1 | cluster_1_1 | ns_1_2 | 11
account1 | cluster_1_2 | infra | 12
account2 | cluster_2_1 | infra | 13
account3 | cluster_3_1 | ns_3_1 | 10
account3 | cluster_3_1 | ns_3_2 | 11
由於 cluster_1_1 有不止一行,並且在命名空間中具有值“infra”,因此該行被刪除。 但是在 cluster_1_2 和 cluster_2_1 的情況下,因為它們只有一行,所以它被保留了。 我的代碼是這樣的:
from pyspark.sql import SparkSession
from pyspark.sql import *
from pyspark.sql.functions import *
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
fields = Row('accountname','clustername','namespace','cost')
s1 = fields("account1","cluster_1_1","ns_1_1",10)
s2 = fields("account1","cluster_1_1","ns_1_2",11)
s3 = fields("account1","cluster_1_1","infra",12)
s4 = fields("account1","cluster_1_2","infra",12)
s5 = fields("account2","cluster_2_1","infra",13)
s6 = fields("account3","cluster_3_1","ns_3_1",10)
s7 = fields("account3","cluster_3_1","ns_3_2",11)
s8 = fields("account3","cluster_3_1","infra",12)
fieldsData=[s1,s2,s3,s4,s5,s6,s7,s8]
df=spark.createDataFrame(fieldsData)
df.show()
提前致謝。
看看這個,你可以首先使用 window function 計算集群名的計數,由 accountname &clustername 分區,然后對計數大於 1 和 namespace=infra 的行使用過濾器的否定
from pyspark.sql import functions as F
from pyspark.sql.window import Window
w= Window.partitionBy("accountname", "clustername")
df.withColumn("count", F.count("clustername").over(w))\
.filter(~((F.col("count")>1)&(F.col("namespace")=='infra')))\
.drop("count").orderBy(F.col("accountname")).show()
+-----------+-----------+---------+----+
|accountname|clustername|namespace|cost|
+-----------+-----------+---------+----+
| account1|cluster_1_1| ns_1_1| 10|
| account1|cluster_1_1| ns_1_2| 11|
| account1|cluster_1_2| infra| 12|
| account2|cluster_2_1| infra| 13|
| account3|cluster_3_1| ns_3_1| 10|
| account3|cluster_3_1| ns_3_2| 11|
+-----------+-----------+---------+----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.