首页 文章

将嵌套的对象列表合并到一个列表中

提问于
浏览
0

我有一个对象列表,其中一个是另一个列表(或实际上,Seq [Row] - 这些是RDD),我想将它们合并在一起 . 有一个列 <a, b, c, d> 的列表,其中 d 本身是另一个列表 <q, r, s, t> ,其中一个是另一个嵌套列表但是为了简单起见,我们忽略它 . 我想将此更改为 <a, b, c, q1, r1, s1, t1>, <a, b, c, q2, r2, s2, t2> ... 列表

我可以将信息提取到案例类等中然后将它们放在一起,但我觉得应该有一种方法可以使用 zipmap 等以更好的功能方式编写它,我应该怎么做?

编辑详细说明:

这些列表来自hdfs上的嵌套RDD表 .

parent: <Long, String, String, Long, String, Float, Seq[Row] foolist >
foolist: <String, String, Long, Int, Seq[Row] barlist >
barlist: <String, Boolean, Int, Long, Seq[Row] list1, Seq[Row] list2 >

他们有更多的领域而不是陈述 . 除了父对象之外,我不需要过滤掉最终结果中的任何字段,其中父对象中的一行将成为值的集合 .

{parent row}, {foo row 1}, {barlist row 1}
{parent row}, {foo row 1}, {barlist row 2}
{parent row}, {foo row 1}, {barlist row N}
{parent row}, {foo row 2}, {barlist row 1}
{parent row}, {foo row 2}, {barlist row N}
...
{parent row}, {foo row M}, {barlist row N}

它们不是元组,只是一个简单的字段列表(Long,String,String,Long,String,Float,String,String,Long,Int,String,Boolean,Int,Long ..)

2 回答

  • 2

    您可以使用flatMap:

    seq.flatMap {case(a,b,c,d)=> d.map {case(q,r,s,t)=>(a,b,c,q,r,s,t)}}

    要么:

    val res = for {
      (a,b,c,d) <- seq;
      (q,r,s,t) <- d
    } yield (a,b,c,q,r,s,t)
    
  • 2

    你可以用这个:

    def flat(seq: Seq[Any]):Seq[Any] = seq flatMap {
      case sq:Seq[_] => flat(sq)
      case x => Seq(x)
    }
    

    Edit: 如果你想展平行,你可以尝试:

    def flat(seq: Seq[Any]):Seq[Any] = seq flatMap {
      case Seq(row) => flat(row.toSeq)
      case x => Seq(x)
    }
    

相关问题