当前位置: 首页 > 知识库问答 >
问题:

Spark DataFrame:基于列的透视和分组

段干华皓
2023-03-14

我已经用id、app和客户输入了下面的dataframe

输入数据规则

+--------------------+-----+---------+
|                  id|app  |customer |
+--------------------+-----+---------+
|id1                 |   fw|     WM  |
|id1                 |   fw|     CS  |
|id2                 |   fw|     CS  |
|id1                 |   fe|     WM  |
|id3                 |   bc|     TR  |
|id3                 |   bc|     WM  |
+--------------------+-----+---------+

预期产出

使用pivot和groggrege-make app值作为列名,并将聚合的客户名作为数据表中的列表

+--------------------+----------+-------+----------+
|                  id|   bc     |     fe|    fw    |
+--------------------+----------+-------+----------+
|id1                 |  0       |     WM|   [WM,CS]|
|id2                 |  0       |      0|   [CS]   |
|id3                 | [TR,WM]  |      0|      0   |
+--------------------+----------+-------+----------+

val newDF=df.groupby(“id”).pivot(“app”).agg(expr(“coalesce(first(customer),0)”)).drop(“app”).show()

+--------------------+-----+-------+------+
|                  id|bc   |     fe|    fw|
+--------------------+-----+-------+------+
|id1                 |  0  |     WM|    WM|
|id2                 |  0  |      0|    CS|
|id3                 | TR  |      0|     0|
+--------------------+-----+-------+------+

问题:在我的查询中,我不能在“fw”下为“id1”获得像[WM,cs]这样的客户列表(如预期输出所示),只有“WM”出现。类似地,对于“ID3”,只有“TR”出现--相反,对于“ID3”,应该在“BC”下出现一个带有[TR,wm]值的列表

需要你的建议,以获得每个应用程序下的客户名单。

共有1个答案

平山
2023-03-14

如果您可以在应该为零的单元格中忍受一个空列表,则可以使用collect_list:

df.groupBy("id").pivot("app").agg(collect_list("customer")).show
+---+--------+----+--------+
| id|      bc|  fe|      fw|
+---+--------+----+--------+
|id3|[TR, WM]|  []|      []|
|id1|      []|[WM]|[CS, WM]|
|id2|      []|  []|    [CS]|
+---+--------+----+--------+
 类似资料:
  • 我有一张这样的桌子 基于以上数据,我需要得到这样一个表 我不知道如何使用一些PIVOT来实现这一点

  • 我对Python和熊猫相当陌生,有一个问题我不太确定如何解决。我有一个熊猫DataFrame,其中包含在同一年为多支球队效力的曲棍球运动员: 我希望能够合并包含同一年的同一名球员的行,并按球员为其效力最多的球队排列列。在上面的例子中,B队的所有数字都是第一位的,因为球员A为B队打了最多的比赛,其次是A队,然后是C队。如果一名球员没有为多个队打过球或少于三个队打过球,我希望在给定的列中填写NA。 例

  • 我试图理解MP4视频如何在在线流媒体中通过RTP进行分割(它是用H.264编解码器编码的)。有一些工具,比如FFMPEG或MP4box,或者我们可以使用ISO格式本身[moov,moof和mdat对]进行流媒体传输。我想知道的是,这些工具将如何分割视频中的mdat部分?他们会将MP4视频的所有单元(一组视频和音频帧)分离,并将它们与相关moov部分合并成一个片段,还是以其他方式进行? 还是使用H2

  • 问题内容: 我正在尝试编写查询以创建数据的“表”,如下所示: 这将返回类似: 现在,我希望结果是这样的(来自MySQL查询,而不是由应用程序操纵): 有两个注意事项: 日期范围可以增加或缩小(取决于查询) 在某些情况下,PercentChange可能为null(假设category_7 / 2011-05-12可能没有设置值) 所以最终我不太确定如何构建查询的选择部分以反映动态的列数(我知道它与C

  • 我最近开始学习PySpark的大数据分析。我有以下问题,并试图找到一个更好的方法来实现这一点。我会带你解决下面的问题。 给定下面的pyspark数据框: 我想按列进行分组——Col1、Col2、Col3,并在每个组中按日期时间降序排序 然后,从每个排序的组中选出最上面的一行(即DateTime中最新的一行) 最后,透视Col3值并使用“值” 我该如何以一种有效的方式,以较小的步骤实现这一目标?提前

  • 我正在处理一些数据,并希望将某个列的最大值按不同的列分组。但是,我想根据另一列从最大计算中排除某些行。 示例: 我想得到Col3的最大值,按Col1分组,同时排除Col2中包含“Other”的任何行。因此,“A”的Col3的最大值应该是5,而不是17。 我能够使用:但是,对于a,这将给我一个17的值。 通过查看其他线程,我尝试使用: 这似乎让我接近了(它将数据按Col1分组,并根据Col2删除了行