【问题标题】:How to merge multiple rows into single cell based on id and then count?如何根据id将多行合并为单个单元格然后计数?
【发布时间】:2018-05-27 06:36:26
【问题描述】:

如何使用 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

带有sql代码的示例2:

输入示例:

cloths,brad
cloths,edu
cloths,keith
cloths,stef
enter,andr
enter,char
enter,danny
enter,lucas

代码:

SELECT 
   SS.SEC_NAME,
   STUFF((SELECT '- ' + US.USR_NAME 
          FROM USRS US
          WHERE US.SEC_ID = SS.SEC_ID
          ORDER BY USR_NAME
          FOR XML PATH('')), 1, 1, '') [SECTORS/USERS]
FROM SALES_SECTORS SS
GROUP BY SS.SEC_ID, SS.SEC_NAME
ORDER BY 1

输出:

cloths,brad-edu-keith-stef
enter,andr-char-danny-lucas

在这个例子中,输出没有计数,但应该包括在内。

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

【问题讨论】:

  • 这是一个简单的 pyspark 用例。告诉我们你尝试了什么??
  • ia m new in pyspark 我已经尝试使用 pig 我不知道如何使用 pyspark 所以我需要帮助 group_url = GROUP logdata by (url); X = FOREACH group_url { unique_users = DISTINCT logdata.name; GENERATE FLATTEN(group), COUNT(unique_users) AS UniqueUsers,unique_users as name, COUNT(logdata) as counts;} STORE X INTO 'output/bigdata_analytics_cleaned';
  • @kumar:请使用编辑功能并将代码添加到问题本身,而不是在评论中。此外,您在此处粘贴的代码似乎不包含与问题中相同的列名,并且似乎还做了其他事情。
  • @kumar:根据您的说法,我尝试在问题中添加更多描述,请检查是否正确。我还添加了一个答案,希望对您有所帮助。

标签: python apache-spark dataframe pyspark


【解决方案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|
+--------------+-----+

【讨论】:

  • 谢谢我需要用'-' EX:mobile-watch 分开的数据输出列记录
  • @kumar:对于第二个示例 (sql),您不使用计数。需要还是不需要?
  • @kumar:更新
  • 计算需要的thnks
  • 有没有办法做到这一点并且仍然保留'id'字段?
猜你喜欢
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多