在scala中,我有一个返回值的函数列表。执行功能的顺序很重要,因为功能n
的参数是功能n-1
的输出。因变量的斯卡拉地图
这暗示使用foldLeft
,像:
val base: A
val funcs: Seq[Function[A, A]]
funcs.foldLeft(base)(x, f) => f(x)
(详细:类型A
实际上是一个Spark数据帧)。
但是,每个函数的结果是互斥的,最后我想要将每个函数的所有结果联合起来。 这暗示使用map
,是这样的:
funcs.map(f => f(base)).reduce(_.union(_)
但这里的每个函数应用于base
这不是我想要的。
短:有序功能可变长度列表需要返回相等长度的返回值,其中每个值n-1
是为功能n
(从base
其中n=0
开始)输入的列表。这样可以将结果值连接起来。
我该如何做到这一点?
编辑 例如:
case class X(id:Int, value:Int)
val base = spark.createDataset(Seq(X(1, 1), X(2, 2), X(3, 3), X(4, 4), X(5, 5))).toDF
def toA = (x: DataFrame) => x.filter('value.mod(2) === 1).withColumn("value", lit("a"))
def toB = (x: DataFrame) => x.withColumn("value", lit("b"))
val a = toA(base)
val remainder = base.join(a, Seq("id"), "leftanti")
val b = toB(remainder)
a.union(b)
+---+-----+
| id|value|
+---+-----+
| 1| a|
| 3| a|
| 5| a|
| 2| b|
| 4| b|
+---+-----+
这应该具有的功能的任意数量的工作(如toA
,toB
... toN
每次当先前的结果的余数和传入。下一个函数最后一个联合适用于所有结果
我添加了一个例子来让我的问题更加清晰。 – Tim
你的第一个例子正是我所需要的。好的想法积累到列表中,从来没有想过你可以使用foldLeft。真棒:)。 – Tim