簡體   English   中英

如何在RddPair中使用reduceByKey <K,Tuple> 在斯卡拉

[英]How reduceByKey in RddPair<K,Tuple> in Scala

我有一個CassandraTable。 通過SparkContext.cassandraTable()訪問。 檢索我所有的CassandraRow。

現在我要存儲3個信息:(用戶,城市,字節)我這樣存儲

rddUsersFilter.map(row =>
(row.getString("user"),(row.getString("city"),row.getString("byte").replace(",","").toLong))).groupByKey

我獲得了一個RDD [(String,Iterable [(String,Long)])]現在,對於每個用戶,我想要對所有字節求和並為城市創建一個地圖,如:“city” - >“occurencies”(這個城市有多少時間)這個用戶的appairs)。

以前,我將這個代碼分成兩個不同的RDD,一個用於匯總字節,另一個用於創建映射,如上所述。

城市發生的示例

rddUsers.map(user => (user._1, user._2.size, user._2.groupBy(identity).map(city => (city._1,city._2.size))))

那是因為我可以通過._2方法訪問我的元組的第二個元素。 但現在? 我的第二個元素是Iterable [(String,Long)],我不能像以前那樣映射。

有一個解決方案只用一個rdd和一個MapReduce來檢索我的所有信息嗎?

您可以通過首先為用戶,城市分組字節和城市事件然后按用戶進行分組來輕松完成此操作

val data = Array(("user1","city1",100),("user1","city1",100),
     ("user1","city1",100),("user1","city2",100),("user1","city2",100), 
     ("user1","city3",100),("user1","city2",100),("user2","city1",100),
     ("user2","city2",100))
val rdd = sc.parallelize(data)

val res = rdd.map(x=> ((x._1,x._2),(1,x._3)))
             .reduceByKey((x,y)=> (x._1+y._1,x._2+y._2))
             .map(x => (x._1._1,(x._1._2,x._2._1,x._2._2)))
             .groupByKey
val userCityUsageRdd = res.map(x => { 
 val m = x._2.toList
 (x._1 ,m.map(y => (y._1->y._2)).toMap, m.map(x => x._3).reduce(_+_))
})

產量

res20: Array[(String, scala.collection.immutable.Map[String,Int], Int)] = 
Array((user1,Map(city1 -> 3, city3 -> 1, city2 -> 3),700), 
      (user2,Map(city1 -> 1, city2 -> 1),200))

暫無
暫無

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

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