Pyspark 在字符串列上聚合
我有以下Spark数据框:Pyspark 在字符串列上聚合,pyspark,pyspark-dataframes,Pyspark,Pyspark Dataframes,我有以下Spark数据框: column1|column2 A|"1" A|"1" A|"2" B|"1" 我想得到按第1列分组的每个不同值的计数。预期输出如下所示: column1|column2 A|"1:2,2:1" B|"1:1" 有什么帮助吗?更简单的方法是按第1列和第2列分组: df2=df.groupBy(df.column1,df.column2).count() 因此,您将得到如下结果: column1 | column2 | count A | "1"
column1|column2
A|"1"
A|"1"
A|"2"
B|"1"
我想得到按第1列分组的每个不同值的计数。预期输出如下所示:
column1|column2
A|"1:2,2:1"
B|"1:1"
有什么帮助吗?更简单的方法是按第1列和第2列分组:
df2=df.groupBy(df.column1,df.column2).count()
因此,您将得到如下结果:
column1 | column2 | count
A | "1" | 2
A | "2" | 1
B | "1" | 1
这将是处理所需数据集的最简单方法。如果需要数据集,现在可以连接
column2
和count
,然后按column1
再次分组并连接分组元素。更简单的方法是按column1和column2分组:
df2=df.groupBy(df.column1,df.column2).count()
因此,您将得到如下结果:
column1 | column2 | count
A | "1" | 2
A | "2" | 1
B | "1" | 1
这将是处理所需数据集的最简单方法。如果需要数据集,现在可以连接
column2
和count
,然后按column1
再次分组并连接组元素。使用groupbycolumn1、column2
计算不同的值,然后按column1
再次分组,并收集对的列表column2:count
。大概是这样的:
data = [("A", "1"), ("A", "1"),
("A", "2"), ("B", "1")]
df = spark.createDataFrame(data, ["column1", "column2"])
df.groupBy("column1", "column2").agg(count("*").alias("ct")) \
.groupBy("column1") \
.agg(collect_list(concat(col("column2"), lit(":"), col("ct"))).alias("result")) \
.drop("column2", "ct")\
.show()
给出:
+-------+----------+
|column1| result|
+-------+----------+
| B| [1:1]|
| A|[1:2, 2:1]|
+-------+----------+
使用groupby
column1、column2
对不同的值进行计数,然后再次使用groupbycolumn1
进行分组,并收集对的列表column2:count
。大概是这样的:
data = [("A", "1"), ("A", "1"),
("A", "2"), ("B", "1")]
df = spark.createDataFrame(data, ["column1", "column2"])
df.groupBy("column1", "column2").agg(count("*").alias("ct")) \
.groupBy("column1") \
.agg(collect_list(concat(col("column2"), lit(":"), col("ct"))).alias("result")) \
.drop("column2", "ct")\
.show()
给出:
+-------+----------+
|column1| result|
+-------+----------+
| B| [1:1]|
| A|[1:2, 2:1]|
+-------+----------+
谢谢你,丹尼尔。有没有办法直接使用聚合和sql函数来实现这一点?我可以使用:
df.groupby([“column1”]).agg(f.concat_ws(“,”,f.collect_set(df.column2)))获取按列A分组的第2列的可能值。
但我也想添加计数。谢谢Daniel。有没有办法直接使用聚合和sql函数来实现这一点?我可以使用:df.groupby([“column1”]).agg(f.concat_ws(“,”,f.collect_set(df.column2)))获取按列A分组的第2列的可能值。
,但我还想添加计数。