【发布时间】:2016-03-28 14:23:10
【问题描述】:
我将 .log 文件解析为 JavaRDD,在对这个 JavaRDD 进行排序之后,现在我有了,例如 oldJavaRDD:2016-03-28 | 11:00 | X | object1 | region12016-03-28 | 11:01 | Y | object1 | region12016-03-28 | 11:05 | X | object1 | region1
@987654326 @2016-03-28 | 11:00 | X | object2 | region12016-03-28 | 11:01 | Z | object2 | region1
如何获得newJavaRDD 以将其保存到数据库?
新的 JavaRDD 结构必须是:2016-03-28 | 9 | object1 | region12016-03-28 | 1 | object2 | region1
所以,我必须计算当前行和上一行之间的时间(在某些情况下还使用标志X, Y, Z 来定义,是否添加时间到结果)并在更改date, objectName 或objectRegion 后将新元素添加到JavaRDD。
我可以使用这种类型的代码(map)来做到这一点,但我认为它不好,也不是最快的方式
JavaRDD<NewObject> newJavaRDD = oldJavaRDD.map { r ->
String datePrev[] = ...
if (datePrev != dateCurr ...) {
return newJavaRdd;
} else {
return null;
}
}
【问题讨论】:
-
你能解释一下
X, Y, Z的意思吗?不清楚哪些记录应该包含在输出中,哪些不应该... -
仅举例:上一行包含标志
X,当前行包含Y,所以我们有过渡X->Y。在这种情况下,我们不能在这些行之间聚合时间,结果sum(11:01 - 11:00) = 0。如果Y->X,我们必须聚合行之间的时间,结果sum(11:05 - 11:01) = 4 minutes。如果X->X- 也聚合,结果4 minutes + sum(11:09 - 11:05) = 4 minutes + 4 minutes = 8 minutes。我还必须了解其他一些规则,但它们都与当前行和预览行之间的差异有关。
标签: java apache-spark rdd