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

Spark过滤器并多次计算大RDD

丁翊歌
2023-03-14

假设我有一个RDD[(String,Int)],如下例所示:

(A, 0)
(B, 0)
(C, 1)
(D, 0)
(E, 2)
(F, 1)
(G, 1)
(H, 3)
(I, 2)
(J, 0)
(K, 3)

我想有效地打印包含 0、1、2 等的记录总数。由于RDD包含数百万个条目,我希望尽可能高效地做到这一点。

此示例的输出将返回如下内容:

Number of records containing 0 = 4
Number of records containing 1 = 3
Number of records containing 2 = 2
Number of records containing 3 = 2

目前,我尝试通过对大RDD执行过滤器,然后分别对0、1、2、..执行count()来实现这一点。我正在使用Scala。

有没有更高效的方法来做到这一点?我已经缓存了RDD,但是我的程序仍然耗尽了内存(我已经将驱动内存设置为5G)。

编辑:正如Tzach所建议的,我现在使用CountByKey

rdd.map(_.swap).countByKey()

我是否可以通过将字符串值更改为一个元组(其中第二个元素是“m”或“f”),然后获得该元组的第二个元素的每个唯一值的每个键的计数来改进这一点?

例如:

(A,m), 0)
(B,f), 0)
(C,m), 1)
(D,m), 0)
(E,f), 2)
(F,f), 1)
(G,m), 1)
(H,m), 3)
(I,f), 2)
(J,f), 0)
(K,m), 3)

会导致

((0,m), 2)
((0,f), 2)
((1,m), 2)
((1,f), 1)
((2,m), 0)
((2,f), 2)
((3,m), 2)
((3,f), 0)

提前感谢!

共有1个答案

孔鸿宝
2023-03-14

您可以使用方便的 countByKey 来做到这一点 - 只需事先交换输入中的位置即可使数值成为键:

val rdd = sc.parallelize(Seq(
  ("A", 0), ("B", 0), ("C", 1), ("D", 0), ("E", 2),
  ("F", 1), ("G", 1), ("H", 3), ("I", 2), ("J", 0), ("K", 3)
))

rdd.map(_.swap).countByKey().foreach(println)
// (0,4)
// (1,3)
// (3,2)
// (2,2)

编辑:<code>countByKey</code>完全按照它听起来的样子执行-所以无论你想使用什么键,只要将你的RDD转换为元组的左侧部分,例如:

rdd.map { case ((a, b), i) => ((i, b), a) }.countByKey()

或:

rdd.keyBy { case ((_, b), i) => (i, b) }.countByKey()
 类似资料:
  • 问题内容: 如果选中了复选框,我将显示列表的子集。我想将复选框旁边的X替换为与选择标准匹配的列表的计数。我有一个笨拙的人,除了在这里计算子集之外,什么都做。 我的控制器如下所示: 我的看法如下所示: 问题答案: 您可以在绑定数据时在视图模型本身中设置该计数,或者在作用域上只有一个返回计数的方法。 并将其用作:- 普伦克 如果您在页面上时列表不变,我建议您找出长度并将其绑定到视图模型本身的属性中,然

  • 本文向大家介绍根据多个过滤器JavaScript从JSON数据计算平均值,包括了根据多个过滤器JavaScript从JSON数据计算平均值的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个像这样的对象数组- 我们需要编写一个包含一个这样的数组的JavaScript函数。 该函数应执行以下操作- 将重复的供应商分组为一个唯一的单独对象(通过重复,我们指的是具有相同“ SupplierName”

  • 当我使用spark API运行类似的代码时,它在许多不同的(分布式)作业中运行,并且成功运行。当我运行它时,我的代码(应该做与Spark代码相同的事情),我得到一个堆栈溢出错误。知道为什么吗? 代码如下: 我相信我正在使用与spark相同的所有并行化工作,但它对我不起作用。任何关于使我的代码分发/帮助了解为什么在我的代码中发生内存溢出的建议都将是非常有帮助的

  • 有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。 到目前为止,这

  • 问题内容: 我需要使用类别表过滤查询,该类别表与另一个表具有many2many关系。是否可以过滤与many2many关系的查询? 表具有与表相关的many2many字段,或者说伙伴可以具有许多类别。我需要的是过滤具有类别“业务”或“零售”的表。如果没有任何这些类别,则不应显示。 此外还有另外一个领域是,有关系有: 具有以下关系的字段: 到(many2many) 到(one2many) (字符) 具

  • 我有一个由col1和col2列聚合的源数据集。Col2值通过按位或运算进行聚合。我需要对Col2值应用过滤器,以选择位为8,4,2的记录 初始源原始数据 将Col1值折叠为每Col1值一行后,基于“上面的SourceRawData”聚合源数据,这是其他团队和Col2值通过按位或运算聚合的结果。注意我这里提供的是输出,而不是实际的聚合逻辑 现在,我需要对上面的聚合数据集应用过滤器,以根据原始源原始数