【发布时间】:2016-10-04 16:39:10
【问题描述】:
我有一个文本文件,我阅读它然后使用split 操作进行拆分。这会产生一个带有Array(A, B, C, D, E, F, G, H, I) 的RDD。
我想为每个键 E 找到 max(F) - min(G)(通过键 E 减少)。然后我想通过键 C 组合得到的值,并用相同的键连接每一行的总和结果。
例如:
+--+--+--+--+
| C| E| F| G|
+--+--+--+--+
|en| 1| 3| 1|
|en| 1| 4| 0|
|nl| 2| 1| 1|
|nl| 2| 5| 2|
|nl| 3| 9| 3|
|nl| 3| 6| 4|
|en| 4| 9| 1|
|en| 4| 2| 1|
+-----------+
应该会导致
+--+--+-------------+---+
| C| E|max(F)-min(G)|sum|
+--+--+-------------+---+
|en| 1| 4 |12 |
|nl| 2| 4 |10 |
|nl| 3| 6 |10 |
|en| 4| 8 |12 |
+--+--+-------------+---+
解决这个问题的最佳方法是什么?目前我正在尝试通过运行来执行max(F)-min(G)
val maxCounts = logEntries.map(line => (line(4), line(5).toLong)).reduceByKey((x, y) => math.max(x, y))
val minCounts = logEntries.map(line => (line(4), line(6).toLong)).reduceByKey((x, y) => math.min(x, y))
val maxMinCounts = maxCounts.join(minCounts).map{ case(id, maxmin) => (id, (maxmin._1 - maxmin._2)) }
然后join 生成的 RDD。但是,当我还想对这些值求和并将它们附加到我现有的数据集中时,这变得很棘手。
我很想听听任何建议!
【问题讨论】:
-
使用 Spark SQL DataFrame 很容易,您可以将 RDD 转换为 DataFrame 并执行所有聚合操作.. 试试这个链接 stackoverflow.com/questions/33882894/…
-
为什么不将
math.max和math.min合并到同一个RDD 中?
标签: scala apache-spark aggregate-functions