我有一个表格将表格作为数据框所需的答案在 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 分组并收集StepValue 作为键值对。

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 中的主要内容,如果未能解决你的问题,请参考以下文章

表格和输入所需的电子邮件类型

用HTML的<table>标签,怎么写出一个三行两列的表格?

EXCEL如何筛选表格里相同的文字并统计!

EXCEL表格不能修改怎么办,如何撤销保护?

仅从 CoreDate 或所有内容中获取所需的数据?

当我在 iPhone 的导航栏上单击返回时,如何弹出到所需的视图控制器