2016-08-24 95 views
1

我有以下結構的RDD(RDD[(String,Map[String,List[Product with Serializable]])]):計數唯一值

這是一個樣的數據:

(600,Map(base_data -> List((10:00 01-08-2016,600,111,1,1), (10:15 01-08-2016,615,111,1,5)), additional_data -> List((1,2))) 
(601,Map(base_data -> List((10:01 01-08-2016,600,111,1,2), (10:02 01-08-2016,619,111,1,2), (10:01 01-08-2016,600,111,1,4)), additional_data -> List((5,6))) 

我想要計算的唯一值的數量子列表中的第4個字段。例如,讓我們先看看第一個條目。該列表是List((10:00 01-08-2016,600,111,1,1), (10:15 01-08-2016,615,111,1,5))。它在子列表的第4個字段中包含2個唯一值(15)。

至於第二項,它還包含2個唯一值(24),因爲2重複兩次。

生成的RDD格式應該是RDD[Map[String,Any]]

我嘗試如下解決這個任務:

val result = myRDD.map({ 
    line => Map(("id",line._1),       
       ("unique_count",line._2.get("base_data").groupBy(l => l).count(_)))) 
}) 

但是這個代碼不去做什麼,我需要。事實上,我不知道如何正確地表明我想按第4個字段進行分組...

回答

0

您非常接近解決方案。有沒有必要打電話給groupBy,但是你可以通過索引來訪問的元組的項目,改造所產生的ListSet,然後就返回Set的大小,相當於獨特的元素個數:

("unique_count", line._2("base_data").map(bd => bd.productElement(4)).toSet.size) 
+0

它說'java.lang.IndexOutOfBoundsException:4'。據我瞭解,'bd.productElement(4)'實際上訪問第4個子列表,而不是每個列表中的第4個字段...... Strage – GangsterMaur

+0

也許應該有像'map(t => t.map R => r.productElement(4)))。toSet.size'? – GangsterMaur

+0

'line._2(「base_data」)'返回'Product with Serializable'的'List'。 '.map'迭代此列表中的每個項目。 'bd'是一個'Product with Serializable',用'(10:01 01-08-2016,600,111,1,2)''表示的值',對吧?不確定我們需要更深入地應用「地圖」。順便說一句,你確定列表中的所有項目具有相同的長度和結構? ('IndexOutOfBoundsException'讓我覺得事實並非如此) – Antot