【发布时间】:2015-06-07 21:54:26
【问题描述】:
我正在尝试在不重复文本文件的情况下进行所有行组合。
例子:
- 1
- 2
- 2
- 1
- 1
结果:
- 第 1 行,第 2 行 = (1,2)
- 第 1 行,第 3 行 = (1,2)
- 第 1 行,第 4 行 = (1,1)
- 第 1 行,第 5 行 = (1,1)
- 第 2 行,第 3 行 = (2,2)
- 第 2 行,第 4 行 = (2,1)
- 第 2 行,第 5 行 = (2,1)
- 第 3 行,第 4 行 = (2,1)
- 第 3 行,第 5 行 = (2,1)
- 第 4 行,第 5 行 = (1,1)
或
考虑 (x,y),如果 (x != y) 0 else 1:
- 0
- 0
- 1
- 1
- 1
- 0
- 0
- 0
- 0
- 1
我有以下代码:
def processCombinations(rdd: RDD[String]) = {
rdd.mapPartitions({ partition => {
var previous: String = null;
if (partition.hasNext)
previous = partition.next
for (element <- partition) yield {
if (previous == element)
"1"
else
"0"
}
}
})
}
上面的代码是对我的RDD的第一个元素进行组合,换句话说:(1,2) (1,2) (1,1) (1,1)。
问题是:此代码仅适用于一个分区。我想让这个工作在许多分区上,我该怎么做?
【问题讨论】:
-
你的例子有很多重复的组合,你说你不想要。此外,粗体 or 之后的所有内容都是一个谜。能否请您花一些时间来改进您的问题?
-
@marios,我想要的组合是考虑行但获取数据。 (1,2) = (1,2) (1,3) = (1,2) (1,4) = (1,1) ... 加粗或后: if (x != y) 0 else 1
-
这看起来需要一个相当复杂的聚合函数,因为这不是一个易于分发的问题,因为需要真正跟踪所有状态。
-
这不就是
rdd.cartesian(rdd).distinct()吗? -
不是 rdd.cartesian(rdd).distinct()。
标签: scala apache-spark combinations rdd