我有一个表格将表格作为数据框所需的答案在 spark scala 中
Posted
技术标签:
【中文标题】我有一个表格将表格作为数据框所需的答案在 spark scala 中【英文标题】:I Have a table take the table as a dataframe required answer is in spark scala 【发布时间】:2019-02-27 06:20:22 【问题描述】:我有一个表格将表格作为数据框。
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 |
scala> val df = Seq((1,"A*(B+C)","A",5),(1,"A*(B+C)","B",6),(1,"A*(B+C)","C",5),(2,"A/B","A",12),(2,"A/B","B",6)).toDF("ID","Formula","Step","Value")
df: org.apache.spark.sql.DataFrame = [ID: int, Formula: string ... 2 more fields]
scala> df.show
+---+-------+----+-----+
| ID|Formula|Step|Value|
+---+-------+----+-----+
| 1|A*(B+C)| A| 5|
| 1|A*(B+C)| B| 6|
| 1|A*(B+C)| C| 5|
| 2| A/B| A| 12|
| 2| A/B| B| 6|
+---+-------+----+-----+
我想要这样的答案:
id | Formula | Value |
1 | A*(B+C) | 65 |
2 | A/B | 2 |
【问题讨论】:
请提供更多关于您正在尝试做什么以及您已经尝试过什么的背景信息。 欢迎来到 SO。为了让我们为您提供帮助,请提供一些有关您正在尝试的内容的背景信息,并向我们展示一些您迄今为止尝试过的示例代码。 请给我解决方案。提前致谢 【参考方案1】:您可以按Formula
分组并收集Step
和Value
作为键值对。
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
中的变量值而不是Formula
并获得结果。
val evalUDF = udf((valueMap: Map[String, Int], formula: String) =>
...
)
val output = df.withColumn("Value", evalUDF($"map", $"Formula"))
【讨论】:
感谢您的回答。我是 scala 的新手,所以请写完整的 udf。以上是关于我有一个表格将表格作为数据框所需的答案在 spark scala 中的主要内容,如果未能解决你的问题,请参考以下文章