我花了一些时间才弄明白,我想分享我的解决方案。绝对欢迎改进。
参考文献:Flattening a Scala Map in an RDD,Spark Flatten Seq by reversing groupby, (i.e. repeat header for each sequence in it)
我有一个RDD形式:RDD [(Int,List [(String,List [(String,Int,Float)])])
Key:Int
值:List [(String,List [(String,Int,Float)])]
目标是扁平化为:RDD [(Int,String,String,Int,Float)]
binHostCountByDate.foreach(println)
给出了例子:
(516361, List((2013-07-15, List((s2.rf.ru,1,0.5), (s1.rf.ru,1,0.5))), (2013-08-15, List((p.secure.com,1,1.0)))))
最终的RDD应该给出以下
(516361,2013-07-15,s2.rf.ru,1,0.5)
(516361,2013-07-15,s1.rf.ru,1,0.5)
(516361,2013-08-15,p.secure.com,1,1.0)
答案 0 :(得分:2)
这是一个简单的单行(并且在for-understanding中有解构,我们可以使用比_1,_2._1等更好的名称,这样可以更容易确保我们得到正确的结果
// Use a outer list in place of an RDD for test purposes
val t = List((516361,
List(("2013-07-15", List(("s2.rf.ru,",1,0.5), ("s1.rf.ru",1,0.5))),
("2013-08-15", List(("p.secure.com,",1,1.0))))))
t flatMap {case (k, xs) => for ((d, ys) <- xs; (dom, a,b) <-ys) yield (k, d, dom, a, b)}
//> res0: List[(Int, String, String, Int, Double)] =
List((516361,2013-07-15,s2.rf.ru,,1,0.5),
(516361,2013-07-15,s1.rf.ru,1,0.5),
(516361,2013-08-15,p.secure.com,,1,1.0))
答案 1 :(得分:0)
我的方法如下:
我展平了第一个键值对。这&#34;删除&#34;第一个清单。
val binHostCountForDate = binHostCountByDate.flatMapValues(identity)
给我一个表格的RDD:RDD [(Int,(String,List [(String,Int,Float)])]
binHostCountForDate.foreach(println)
(516361,(2013-07-15,List((s2.rf.ru,1,0.5), (s1.rf.ru,1,0.5))))
(516361,(2013-08-15,List(p.secure.com,1,1.0))
现在我将前两个项目映射到一个元组,创建一个新密钥,第二个元组作为值。然后应用与上面相同的步骤来展平新的键值对。
val binDataRemapKey = binHostCountForDate.map(f =>((f._1, f._2._1), f._2._2)).flatMapValues(identity)
这给出了展平的RDD:RDD [(Int,String),(String,Int,Float)]
如果这个表格没问题,那么我们就完成了,但我们可以更进一步,删除元组以获得我们最初寻找的最终形式。
val binData = binDataRemapKey.map(f => (f._1._1, f._1._2, f._2._1, f._2._2, f._2._3))
这给了我们最终的形式:RDD [(Int,String,String,Int,Float)]
我们现在有一个扁平的RDD,它保留了每个列表的父级。