我花了一段时间才弄明白这一点,我想分享我的解决方案 . 绝对欢迎改进 .
参考文献: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)])])]
关键: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 回答
我的方法如下:
我弄平了第一个键值对 . 这“删除”了第一个列表 .
给我一个表格的RDD:RDD [(Int,(String,List [(String,Int,Float)])]
现在我将前两个项映射到一个元组中,创建一个新键,第二个元组作为值 . 然后应用与上面相同的步骤来展平新的键值对 .
这给出了扁平的RDD:RDD [(Int,String),(String,Int,Float)]
如果这个表格没问题,那么我们就完成了,但我们可以更进一步,删除元组以获得我们最初寻找的最终形式 .
这给了我们最终的形式:RDD [(Int,String,String,Int,Float)]
我们现在有一个扁平的RDD,它保留了每个列表的父级 .
这是一个简单的单行(并且在for-understanding中有解构,我们可以使用比_1,_2._1等更好的名称,这样可以更容易确保我们得到正确的结果