Python 如何根据id将多行合并到单个单元格中,然后进行计数?

Python 如何根据id将多行合并到单个单元格中,然后进行计数?,python,apache-spark,dataframe,pyspark,Python,Apache Spark,Dataframe,Pyspark,如何使用PySpark基于id将多行合并到单个单元格中?我有一个带有ID和产品的数据框架。首先,我想将具有相同id的产品合并到一个列表中,然后我想计算每个唯一列表的出现次数 输入示例1: id,product 1,HOME 1,mobile 2,watch 2,mobile 3,HOME 3,mobile 4,cd 4,music 4,video 输出: product,count HOME-mobile,2 mobile-watch,1 cd-music-video,1 cloths,br

如何使用PySpark基于id将多行合并到单个单元格中?我有一个带有ID和产品的数据框架。首先,我想将具有相同id的产品合并到一个列表中,然后我想计算每个唯一列表的出现次数

输入示例1:

id,product
1,HOME
1,mobile
2,watch
2,mobile
3,HOME
3,mobile
4,cd
4,music
4,video
输出:

product,count
HOME-mobile,2
mobile-watch,1
cd-music-video,1
cloths,brad-edu-keith-stef
enter,andr-char-danny-lucas
示例2使用sql代码:

输入示例:

cloths,brad
cloths,edu
cloths,keith
cloths,stef
enter,andr
enter,char
enter,danny
enter,lucas
代码:

输出:

product,count
HOME-mobile,2
mobile-watch,1
cd-music-video,1
cloths,brad-edu-keith-stef
enter,andr-char-danny-lucas
在本例中,输出没有计数,但应包括计数


我想用PySpark而不是sql/pig来解决这个问题。

你可以使用
groupby
在PySpark中解决这个问题。在id列上首先分组,然后将产品合并到一个单独的排序列表中。要获取此类列表的计数,请再次使用
groupby
,然后按
count
进行聚合

from pyspark.sql import functions as F

df2 = (df
  .groupby("id")
  .agg(F.concat_ws("-", F.sort_array(F.collect_list("product"))).alias("products"))
  .groupby("products")
  .agg(F.count("id")).alias("count"))
这将为您提供如下数据帧:

+--------------+-----+
|      products|count|
+--------------+-----+
|   HOME-mobile|    2|
|  mobile-watch|    1|
|cd-music-video|    1|
+--------------+-----+

通过使用
groupby
,您可以在PySpark中完成此操作。在id列上首先分组,然后将产品合并到一个单独的排序列表中。要获取此类列表的计数,请再次使用
groupby
,然后按
count
进行聚合

from pyspark.sql import functions as F

df2 = (df
  .groupby("id")
  .agg(F.concat_ws("-", F.sort_array(F.collect_list("product"))).alias("products"))
  .groupby("products")
  .agg(F.count("id")).alias("count"))
这将为您提供如下数据帧:

+--------------+-----+
|      products|count|
+--------------+-----+
|   HOME-mobile|    2|
|  mobile-watch|    1|
|cd-music-video|    1|
+--------------+-----+


这是pyspark的一个简单用例。告诉我们你尝试了什么??我在pyspark中是新的,我已经尝试了pig,我不知道如何使用pyspark,所以我需要该组的帮助。\u url=组日志数据依据(url);X=FOREACH group_url{unique_users=DISTINCT logdata.name;生成flant(group)、COUNT(unique_users)作为UniqueUsers、unique_users作为name、COUNT(logdata)作为counts;}将X存储到“output/bigdata_analytics”中@库马尔:请使用编辑功能,将代码添加到问题本身,而不是添加到注释中。此外,您粘贴在此处的代码似乎与问题中的列名不同,并且似乎还做了其他事情。@kumar:根据您所说的,我试图为问题添加更多描述,请检查是否正确。我还添加了一个答案,希望能对您有所帮助。这是pyspark的一个简单用例。告诉我们你尝试了什么??我在pyspark中是新的,我已经尝试了pig,我不知道如何使用pyspark,所以我需要该组的帮助。\u url=组日志数据依据(url);X=FOREACH group_url{unique_users=DISTINCT logdata.name;生成flant(group)、COUNT(unique_users)作为UniqueUsers、unique_users作为name、COUNT(logdata)作为counts;}将X存储到“output/bigdata_analytics”中@库马尔:请使用编辑功能,将代码添加到问题本身,而不是添加到注释中。此外,您粘贴在此处的代码似乎与问题中的列名不同,并且似乎还做了其他事情。@kumar:根据您所说的,我试图为问题添加更多描述,请检查是否正确。我还添加了一个答案,希望能对您有所帮助。谢谢,我需要数据输出columrecord seprate with“-”例如:mobile-watch@kumar:对于第二个示例(sql),您不使用计数。需要还是不需要?@kumar:Updatedcount需要知道有什么方法可以做到这一点并且仍然保留“id”字段?谢谢我需要数据输出ColumRecord seprate with“-”例如:mobile-watch@kumar:对于第二个示例(sql),您不使用计数。需要还是不需要?@kumar:Updatedcount需要这样做,并且仍然保留“id”字段吗?