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

在Spark DataFrame中查找每组的最大行数

相野
2023-03-14

在一个14节点的Google Dataproc集群中,我有大约600万个名字,它们被两个不同的系统转换为ID:SASB。每个包含名称ID_SAID_SB。我的目标是生成从ID_SAID_SB的映射,以便对于每个ID_SA,对应的ID_SB是附加到ID_SA的所有名称中最常见的id。

让我们试着用一个例子来澄清一下。如果我有以下行:

[Row(name='n1', id_sa='a1', id_sb='b1'),
 Row(name='n2', id_sa='a1', id_sb='b2'),
 Row(name='n3', id_sa='a1', id_sb='b2'),
 Row(name='n4', id_sa='a2', id_sb='b2')]

我的目标是生成从A1B2的映射。实际上,与A1关联的名称是N1N2N3,它们分别映射到B1B2,因此B2是与A1关联的名称中最常见的映射。同样,A2将映射到B2。假设总会有赢家是可以的:没有必要打破联系。

我希望可以在我的dataframe上使用groupby(df.id_sa),但我不知道下一步该怎么做。我希望聚合最终能够产生以下行:

[Row(id_sa=a1, max_id_sb=b2),
 Row(id_sa=a2, max_id_sb=b2)]

但也许我试图使用错误的工具,我应该回到使用RDDS。

共有1个答案

濮阳国兴
2023-03-14

使用join(如果有联系,将导致组中有多行):

import pyspark.sql.functions as F
from pyspark.sql.functions import count, col 

cnts = df.groupBy("id_sa", "id_sb").agg(count("*").alias("cnt")).alias("cnts")
maxs = cnts.groupBy("id_sa").agg(F.max("cnt").alias("mx")).alias("maxs")

cnts.join(maxs, 
  (col("cnt") == col("mx")) & (col("cnts.id_sa") == col("maxs.id_sa"))
).select(col("cnts.id_sa"), col("cnts.id_sb"))

使用窗口函数(将拖放领带):

from pyspark.sql.functions import row_number
from pyspark.sql.window import Window

w = Window().partitionBy("id_sa").orderBy(col("cnt").desc())

(cnts
  .withColumn("rn", row_number().over(w))
  .where(col("rn") == 1)
  .select("id_sa", "id_sb"))

使用结构排序:

from pyspark.sql.functions import struct

(cnts
  .groupBy("id_sa")
  .agg(F.max(struct(col("cnt"), col("id_sb"))).alias("max"))
  .select(col("id_sa"), col("max.id_sb")))
 类似资料:
  • 环境:Java1.8,VM Cloudera QuickStart。我有从csv文件到Hadoop hdfs的数据。每一行代表一条公共汽车路线。

  • 问题内容: 我有一个类似于下面的多维数组。我试图实现的是一种从数组中查找和获取“ Total”值最高的数组的方法,现在我知道有一个称为的函数,但不适用于像这样的多维数组。 我想做的是创建一个foreach循环并仅使用总数构建一个新数组,然后使用它来找到最大值,这将起作用,唯一的问题是检索与此相关的其余数据最大值。我不确定这也是最有效的方法。 有任何想法吗? 问题答案: 从PHP 5.5开始,您可以

  • 本文向大家介绍在Python中的每个子列表中查找最大值,包括了在Python中的每个子列表中查找最大值的使用技巧和注意事项,需要的朋友参考一下 我们得到一个列表列表。在内部列表或子列表中,我们需要在每个列表中找到最大值。 与最大和 我们设计一个带in条件的for循环,并应用max函数来获取每个子列表中的最大值。 示例 输出结果 运行上面的代码给我们以下结果- 带映射和最大 在遍历子列表时,我们继续

  • 我想分别找到数组数组中每个数组的第一个和第二个元素的最大数量: 当前方式返回每个数组中最大数的数组。如何返回第一个元素中最大的元素和第二个元素中最大的元素?预期结果将是:

  • 我需要从越来越多的温度记录中挑选每日最小值和最大值: 日期和时间温度摄氏度 .. 20/1/2017 10:05 0.3 20/1/2017 11:08 0.4 .. 结果如下: 日期最低温度最高温度 20/1/2017 -0.5 2.2 21/1/2017 -0.3 3.0 ... 我能够使用=FILTER(范围、日期标准)提取特定日期的数据,但我找不到数组中所有日期的最小值和最大值。非常感谢你