当前位置: 首页 > 知识库问答 >
问题:

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

蔚宏大
2023-03-14

我花了一段时间才弄明白这一点,我想分享我的解决方案。当然欢迎改进。

参考:在RDD中展平Scala映射,通过反转groupby(即,为其中的每个序列重复标题)来展平序列

我有一个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个答案

包兴思
2023-03-14

我的方法如下:

我将第一个键值对展平。这将“删除”第一个列表。

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

淳于星宇
2023-03-14

这是一个简单的单行(在理解中使用解构,我们可以使用比_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))
 类似资料:
  • 我有一门java课 在上面的场景中,示例具有子示例,这又是示例列表。此嵌套可以是 n 级。我想实现的是有一个示例列表,即扁平化上面的对象并将所有示例收集到最终列表中(收集所有n级示例)。一个明显的方法是递归。在Java中有什么方法可以更有效地实现它。我尝试了一些java 8概念,但它们不符合要求。

  • 问题内容: 给定一个,其中值是a 或另一个,那么如何使用Java 8将地图展平到单个值列表? 例: 对于上面的示例,我想要以下列表: 我知道可以这样做: 我该如何使用? 编辑: 经过一番游戏后,我发现了: 问题答案: 您可以定义一个递归方法来展平一个地图并将其用作函数或直接调用它来使用。 例: 对于给定的嵌套地图,它会打印 [value1,value2,value3.1,value3.2,valu

  • 我有这个json 我想生成两个变量,比如 它们在和 我读过这篇文章,但它只适用于地图,但我的json是嵌套json。我怎样才能得到结果?

  • 我对斯卡拉和Spark都很陌生,所以如果我做错了,请原谅我。在接收csv文件,过滤和映射之后;我有一个RDD,它是一堆(字符串,双)对。 当我在RDD上使用.groupByKey()时, 得到一个有一堆(String,[Double])对的RDD。(我不知道CompactBuffer是什么意思,可能会导致我的问题?) 一旦他们被分组,我将尝试取平均值和标准偏差。我只想使用.mean()和.samp

  • 问题内容: 也许有人可以帮助我。我试图将以下ist放到pandas数据框中: 结果应如下所示: 但是我尝试做的所有事情都无法获得预期的结果。我用了这样的东西: 但是然后我松开了_source字段之外的类型。我也尝试与 但是我不知道如何使用字段_source并将其附加到原始数据帧。 有人知道如何做到这一点并达到预期的结果吗? 问题答案: 用途:

  • 问题内容: 假设你有一个像这样的字典: 你将如何将其扁平化为: 问题答案: 基本上与展平嵌套列表的方式相同,只需要做额外的工作即可按键/值迭代字典,为新字典创建新键并在最后一步创建字典。