展平RDD - 键值对中的嵌套列表

时间:2016-03-09 15:46:06

标签: scala apache-spark

我花了一些时间才弄明白,我想分享我的解决方案。绝对欢迎改进。

参考文献:Flattening a Scala Map in an RDDSpark 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)

2 个答案:

答案 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,它保留了每个列表的父级。