在 scala 中,我有一个返回值的函数列表。函数的执行顺序很重要,因为 function 的参数是 functionn
的输出n-1
。
这提示使用foldLeft
,例如:
val base: A
val funcs: Seq[Function[A, A]]
funcs.foldLeft(base)(x, f) => f(x)
(细节:类型A
实际上是一个 Spark DataFrame)。
但是,每个函数的结果是互斥的,最后我想要每个函数的所有结果的并集。这提示使用 a map
,例如:
funcs.map(f => f(base)).reduce(_.union(_)
但是这里每个函数都应用到base
了我不想要的。
Short:一个可变长度的有序函数列表需要返回一个相等长度的返回值列表,其中每个值n-1
都是函数的输入n
(从base
where开始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
每次计算前一个结果的剩余部分并将其传递给下一个函数。最后,一个联合应用于所有结果。