【问题标题】:Merging nested list of objects into a single list将嵌套的对象列表合并到一个列表中
【发布时间】:2016-02-11 20:19:27
【问题描述】:

我有一个对象列表,其中一个是另一个列表(或者实际上,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 ..)

【问题讨论】:

  • 我建议将一些实际代码放入其中,最好是某种测试用例。外列表和内列表的类型是什么?
  • @AngeloGenovese 完成,此数据来自 Spark RDD,因此列表数据为 Seq[Row]
  • 如果发布实际数据和预期输出会更有用。仍然很难弄清楚这里发生了什么。

标签: scala apache-spark


【解决方案1】:

您可以为此使用 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)
    }
    

    编辑: 如果你想扁平化行,你可以试试:

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

    【讨论】:

    • 试过了,但我认为这会将所有内容扁平化为一个列表,这不是我想要的,在问题中添加了更多细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多