我已经尝试过这样做,并且认为"压扁"可能是我的解决方案的一部分,但我无法解决。
想象:
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很陌生,我不得不在飞行中学习这一点,所以任何完整的解释都会非常受欢迎。
如果可以,我想避免引入太多外部库。 与此同时,我会继续阅读。感谢
答案 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 *