Pyspark 在字符串列上聚合

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"

我有以下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"     | 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
再次分组并连接组元素。

使用groupby
column1、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
对不同的值进行计数,然后再次使用groupby
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]|
+-------+----------+

谢谢你,丹尼尔。有没有办法直接使用聚合和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列的可能值。
,但我还想添加计数。