如何在Scala中另一个对象列表中组合对象列表

时间:2015-07-02 10:54:20

标签: scala apache-spark

我已经尝试过这样做,并且认为"压扁"可能是我的解决方案的一部分,但我无法解决。

想象:

case class Thing (value1: Int, value2: Int)
case class Container (string1: String, listOfThings: List[Thing], string2: String)

所以我的清单:

List[Container]

可以是任何尺寸,但现在我们只有3个。

每个Container内都有一个列表

listofthings[Thing]

也可能有多种类型的东西,现在我们也只有3个。

所以我想得到的就是

fullListOfThings[Thing] = List(Thing(1,1), Thing(1,2), Thing(1,3),
    Thing(2,1), Thing(2,2), Thing(2,3), Thing(3,1), Thing(3,2), Thing(3,3))

Thing中的第一个值是它的容器号,第二个值是该容器中的Thing数。

我希望这一切都有道理。

为了让我更复杂,我的Container列表实际上不是一个列表而是一个RDD,

RDD rddOfContainers[Container]

我最终需要的是事物的RDD

fullRddOfThings[Thing]

在我更习惯的Java中,这将是非常简单的,但Scala是不同的。我对Scala很陌生,我不得不在飞行中学习这一点,所以任何完整的解释都会非常受欢迎。

如果可以,我想避免引入太多外部库。 与此同时,我会继续阅读。感谢

2 个答案:

答案 0 :(得分:2)

拥有RDD以及任何其他正确的scala集合,您可以使用flatMap进行此类操作

val containers = sc.parallelize(Seq(
  Container("",List(Thing(1,2), Thing(2,3)),""), 
  Container("", Nil,""), 
  Container("",List(Thing(3,4)),"")))
//containers: org.apache.spark.rdd.RDD[Container]
val things = containers flatMap (_.listOfThings)
//things: org.apache.spark.rdd.RDD[Thing]
things.collect()
//res2: Array[Thing] = Array(Thing(1,2), Thing(2,3), Thing(3,4))

答案 1 :(得分:0)

from scapy.all import *