Apache spark 我有一个表,把表作为数据框,需要的答案是spark scala

Apache spark 我有一个表,把表作为数据框,需要的答案是spark scala,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个表,将表作为数据帧 id | Formula | Step | Value | 1 | A*(B+C) | A | 5 | 1 | A*(B+C) | B | 6 | 1 | A*(B+C) | C | 7 | 2 | A/B | A | 12 | 2 | A/B | B | 6 | 预期结果数据帧 使用spark和scala所需的解决方案 id | Formula | Val

我有一个表,将表作为数据帧

 id | Formula | Step | Value | 
 1  | A*(B+C) |  A   |  5    |
 1  | A*(B+C) |  B   |  6    |
 1  | A*(B+C) |  C   |  7    |
 2  | A/B     |  A   |  12   |
 2  | A/B     |  B   |  6    |
预期结果数据帧 使用spark和scala所需的解决方案

id  | Formula | Value | 
 1  | A*(B+C) |   65  | 
 2  | A/B     |   2   | 
我想要这样的答案:

id  | Formula | Value | 
 1  | A*(B+C) |   65  | 
 2  | A/B     |   2   | 
您可以按公式分组,并将步长和值收集为键值对

scala> df.groupBy($"Formula").agg(collect_list(map($"Step",$"Value")) as "map").show(false)
+-------+---------------------------------------+
|Formula|map                                    |
+-------+---------------------------------------+
|A*(B+C)|[Map(A -> 5), Map(B -> 6), Map(C -> 5)]|
|A/B    |[Map(A -> 12), Map(B -> 6)]            |
+-------+---------------------------------------+
现在您可以编写一个UDF来替换map over公式中的变量值并获得结果

val evalUDF = udf((valueMap: Map[String, Int], formula: String) => {
...
})

val output = df.withColumn("Value", evalUDF($"map", $"Formula"))

请提供更多的背景信息,了解您正在尝试做什么以及您已经尝试了什么。欢迎来到SO。为了让我们帮助您,请提供一些您正在尝试的内容,并向我们展示一些到目前为止您所尝试的示例代码。请给出解决方案。谢谢你的回答。我是新的火花与scala,所以,请写完整的自定义项。
val evalUDF = udf((valueMap: Map[String, Int], formula: String) => {
...
})

val output = df.withColumn("Value", evalUDF($"map", $"Formula"))