Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mapreduce 有可能避免交叉转换吗?_Mapreduce_Apache Flink - Fatal编程技术网

Mapreduce 有可能避免交叉转换吗?

Mapreduce 有可能避免交叉转换吗?,mapreduce,apache-flink,Mapreduce,Apache Flink,先生们 我正在ApacheFlink中使用DataSetaAPI处理批处理,我想计算数据集中所有元素的“相似性” 让函数计算相似性(e1,e2)计算并返回元素e1和e2的相似性 将数据集本身与数据集交叉可以很好地工作,但是,我浪费了大量的时间和处理不必要的微积分。我真的不需要计算所有元素的笛卡尔积,因为可以做一些改进: i) 不需要计算相同元素的相似性。e、 g.计算相似性(A,A) ii)计算相似性(A,B)⇔ 计算相似性(B,A)。相似性(A,B)和(B,A)是等价的,我只需要计算其中一个

先生们

我正在ApacheFlink中使用DataSetaAPI处理批处理,我想计算数据集中所有元素的“相似性”

让函数计算相似性(e1,e2)计算并返回元素e1和e2的相似性

将数据集本身与数据集交叉可以很好地工作,但是,我浪费了大量的时间和处理不必要的微积分。我真的不需要计算所有元素的笛卡尔积,因为可以做一些改进:

i) 不需要计算相同元素的相似性。e、 g.计算相似性(A,A)
ii)计算相似性(A,B)⇔ 计算相似性(B,A)。相似性(A,B)和(B,A)是等价的,我只需要计算其中一个

使用flink,我如何应用一种转换,在这种转换中,我可以只计算必要的相似性,而不是所有的相似性(交叉)

如果我不清楚上面的内容,这里有一个简单的例子:
Dt=包含4个元素的数据集。
Dt={e1,e2,e3,e4}。
无论我使用cross(Dt.cross(Dt)),它都返回所有这些组合:((e1,e1),(e1,e2),(e1,e3),(e1,e4),(e2,e1),(e2,e2),(e2,e2),(e2,e4),(e3,e1),…,(e4,e4))。
然而,我只需要这些组合:(e1,e2),(e1,e3),(e1,e4),(e2,e3),(e2,e4),(e3,e4)


谢谢你的帮助

您可以手动构造一个避免排列的连接模式。您可以通过为每个元素分配递增索引(0表示元素数-1),然后让每个元素仅与索引小于或等于其自身的元素联接:

val env=ExecutionEnvironment.getExecutionEnvironment
val input=env.fromElements(1,2,3,4,5,6).rebalance()
//我们首先为每个元素分配一个从0到input.size-1的递增索引
val indexedInput=input.zipWithIndex
//在这里,我们生成连接集,我们说(idx,element)将与all连接
//索引最多为idx的元素
val joinSet=indexedInput.flatMap{
输入=>用于(i(a._2,b._2)
}
您应该尝试哪些程序运行得更快,因为
zipWithIndex
将触发单独的作业执行