簡體   English   中英

火花過濾器並多次計算大RDD

[英]Spark filter and count big RDD multiple times

說我有一個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)

提前致謝!

您可以countByKey使用方便的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)

編輯countByKey確實聽起來很像-因此,無論您要使用什么鍵,只需將RDD轉換為具有該值的元組的左側即可,例如:

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

要么:

rdd.keyBy { case ((_, b), i) => (i, b) }.countByKey()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM