Pyspark Spark聚合/分组,以确定新列';s值基于集合中的列值
我有一些数据将按id分组Pyspark Spark聚合/分组,以确定新列';s值基于集合中的列值,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一些数据将按id分组 id, field 0 A 0 B 0 C 1 B 1 B 1 C 2 E 我想按ID分组,并计算一个简单的新值,is_special,即按ID分组,如果有(字段)在一个特殊集合{a,E}(只是一组随机字母,没有模式) 有点像Pypark 我想了解如何在不进行实际分组的情况下进行分组,并创建一个新列: 我认为可以使用下面的一些方法来实现,但我不知道如何在时使用窗口 from F i
id, field
0 A
0 B
0 C
1 B
1 B
1 C
2 E
is_special
,即按ID分组,如果有(字段)在一个特殊集合{a,E}
(只是一组随机字母,没有模式)时使用窗口
from F import when, col, coalesce
special = ['A', 'E']
window = Window.partitionBy('product_ari')
df.withColumn("is_special",
when(col("field").isin(special), lit(True))
)
测试集创建:
a=[
(0,“A”),
(0,“B”),
(0,“C”),
(1,“B”),
(1,“B”),
(1,“C”),
(2,“E”),
]
b=[“id”,“字段”]
df=spark.createDataFrame(a,b)
集合=(“A”、“E”)
有几种方法可以做到这一点
加入
从pyspark.sql导入函数为F
agg_df=(
df.withColumn(
“is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
)
.groupBy(“id”)
.agg(F.max(“特殊”)。别名(“特殊”))
)
加入(agg_-df,on=“id”,how=“left”).show()
+---+-----+----------+
|id |字段|是特殊的|
+---+-----+----------+
|0 | A |正确|
|0 | B |正确|
|0 | C |正确|
|1 | B |假|
|1 | B |假|
|1 | C |假|
|2 | E |正确|
+---+-----+----------+
有窗户
从pyspark.sql导入窗口
df.withColumn(
“is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
).withColumn(“is_special”,F.max(“is_special”).over(Window.partitionBy(“id”)).show()
#或“一行”
df.withColumn(
“是特别的”,
F.max(F.when(F.expr(F“fieldin{set_}”),True。否则(False))。结束(
窗口分割人(“id”)
),
).show()
+---+-----+----------+
|id |字段|是特殊的|
+---+-----+----------+
|0 | A |正确|
|0 | B |正确|
|0 | C |正确|
|1 | B |假|
|1 | B |假|
|1 | C |假|
|2 | E |正确|
+---+-----+----------+
测试集创建:
a=[
(0,“A”),
(0,“B”),
(0,“C”),
(1,“B”),
(1,“B”),
(1,“C”),
(2,“E”),
]
b=[“id”,“字段”]
df=spark.createDataFrame(a,b)
集合=(“A”、“E”)
有几种方法可以做到这一点
加入
从pyspark.sql导入函数为F
agg_df=(
df.withColumn(
“is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
)
.groupBy(“id”)
.agg(F.max(“特殊”)。别名(“特殊”))
)
加入(agg_-df,on=“id”,how=“left”).show()
+---+-----+----------+
|id |字段|是特殊的|
+---+-----+----------+
|0 | A |正确|
|0 | B |正确|
|0 | C |正确|
|1 | B |假|
|1 | B |假|
|1 | C |假|
|2 | E |正确|
+---+-----+----------+
有窗户
从pyspark.sql导入窗口
df.withColumn(
“is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
).withColumn(“is_special”,F.max(“is_special”).over(Window.partitionBy(“id”)).show()
#或“一行”
df.withColumn(
“是特别的”,
F.max(F.when(F.expr(F“fieldin{set_}”),True。否则(False))。结束(
窗口分割人(“id”)
),
).show()
+---+-----+----------+
|id |字段|是特殊的|
+---+-----+----------+
|0 | A |正确|
|0 | B |正确|
|0 | C |正确|
|1 | B |假|
|1 | B |假|
|1 | C |假|
|2 | E |正确|
+---+-----+----------+
为了获得一点知识,还需要进行以下工作:
从pyspark.sql.functions导入(
数组_相交,
大小,
数组_除了,
收集集合,
点燃,
阵列,
爆炸,,
)
df=sc.parallelize(
[
(0,“A”),
(0,“B”),
(0,“C”),
(1,“B”),
(1,“B”),
(1,“C”),
(2,“A”),
(2,“E”),
(2,“A”),
(2,“A”),
(2,“G”),
(2,“J”),
(3,“A”),
(4,“E”),
(5,“A”),
(5,“E”),
(6,“Z”),
]
).toDF([“id”,“字段”])
df2=df.groupby(“id”).agg(collect_set(“field”).alias(“X”))
df3a=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)),lit(“A”;))>=1)
df3b=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)、lit(“A”;))==0)
df4=(
df3a.select(df3a.id,explode(df3a.X).alias(“字段”))
.withColumn(“是特别的”,亮起(真实))
.工会(
df3b.select(df3b.id,explode(df3b.X).alias(“字段”)).withColumn(
“是否特别”,亮起(假)
)
)
)
df4.show()
返回:
+---+-----+----------+
| id|field|is_special|
+---+-----+----------+
| 0| C| true|
| 0| B| true|
| 0| A| true|
| 5| E| true|
| 5| A| true|
| 3| A| true|
| 2| J| true|
| 2| E| true|
| 2| G| true|
| 2| A| true|
| 4| E| true|
| 6| Z| false|
| 1| C| false|
| 1| B| false|
+---+-----+----------+
对于一点知识分子来说,还可以进行以下工作:
从pyspark.sql.functions导入(
数组_相交,
大小,
数组_除了,
收集集合,
点燃,
阵列,
爆炸,,
)
df=sc.parallelize(
[
(0,“A”),
(0,“B”),
(0,“C”),
(1,“B”),
(1,“B”),
(1,“C”),
(2,“A”),
(2,“E”),
(2,“A”),
(2,“A”),
(2,“G”),
(2,“J”),
(3,“A”),
(4,“E”),
(5,“A”),
(5,“E”),
(6,“Z”),
]
).toDF([“id”,“字段”])
df2=df.groupby(“id”).agg(collect_set(“field”).alias(“X”))
df3a=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)),lit(“A”;))>=1)
df3b=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)、lit(“A”;))==0)
df4=(
df3a.select(df3a.id,explode(df3a.X).alias(“字段”))
.withColumn(“是特别的”,亮起(真实))
.工会(
df3b.select(df3b.id,explode(df3b.X).alias(“字段”)).withColumn(
“是否特别”,亮起(假)
)
)
)
df4.show()
返回:
+---+-----+----------+
| id|field|is_special|
+---+-----+----------+
| 0| C| true|
| 0| B| true|
| 0| A| true|
| 5| E| true|
| 5| A| true|
| 3| A| true|
| 2| J| true|
| 2| E| true|
| 2| G| true|
| 2| A| true|
| 4| E| true|
| 6| Z| false|
| 1| C| false|
| 1| B| false|
+---+-----+----------+
为什么要关窗户?那问题是什么?好问题我得说为什么要关窗户?那问题是什么?好问题我必须问say@Steven也许你能欣赏answ
+---+-----+----------+
| id|field|is_special|
+---+-----+----------+
| 0| C| true|
| 0| B| true|
| 0| A| true|
| 5| E| true|
| 5| A| true|
| 3| A| true|
| 2| J| true|
| 2| E| true|
| 2| G| true|
| 2| A| true|
| 4| E| true|
| 6| Z| false|
| 1| C| false|
| 1| B| false|
+---+-----+----------+