hadoop 如何计算相似度

2018-08-26 20:58:23 +08:00
 louxinbo
刚学 hadoop,第一个作业是求两地的温度相似程度。
输入文件是:
地点 ID 年份 最高平均温度
相似度的计算是:两个地点的各年温度差求和 /总年数

看到一个博客给的思路。但是不太明白具体的步骤。有没有大神帮忙解释一下:

输入:
1 f(1)
2 f(2)
3 f(3)
4 f(4)



mapper:
1,2 f(1)
1,3 f(1)
1,4 f(1)

1,2 f(2)
2,3 f(2)
2,4 f(2)

1,3 f(3)
2,3 f(3)
3,4 f(3)

1,4 f(4)
2,4 f(4)
3,4 f(4)


reducer:
1,2 f(1) f(2)
1,3 f(1) f(3)
1,4 f(1) f(4)

2,3 f(2) f(3)
2,4 f(2) f(4)

3,4 f(3) f(4)



本文作者:linger

本文链接: http://blog.csdn.net/lingerlanlan/article/details/46289661

我不太明白的是 MAPPER 如何把不同的两行联合作为 key
1898 次点击
所在节点    程序员
3 条回复
billlee
2018-08-26 22:42:38 +08:00
这个并不是联合两行联合,而是需要预先知道所有 x, 比如 0 <= x < n.
让 mapper(x, f(x)) 产生 n 个输出:(x, i, f(x)), 0 <= i < n.

那么对于 x_a 和 x_b, x_a 产生的输出中有 (x_a, i, f(x_a), i = x_b, x_b 产生的输出中会有 (x_b, i, f(x_b)), i = x_a

如果我们把 (x, i) 视为 key, 那么 x_a 和 x_b 产生 key 就是 (x_a, x_b) 和 (x_b, x_a), value 是 f(x_a), f(x_b)

现在的问题是 (x_a, x_b) 和 (x_b, x_a) 的顺序是相反的,reducer 的时候没法汇聚到一起。这里需要做个小调整,在产生 key 是做个小变化,让 x 和 i 两个数中,小的那个放在前面,那么这两个 key 就是一样的了,reducer 的时候就能吧 f(x_a) 和 f(x_b) 汇聚到一起,算出 |f(x_a) - f(x_b)|.

建议你不要再花时间去搞 hadoop mapreducer 了,直接学 spark 吧。
liprais
2018-08-26 23:19:16 +08:00
spark sql 一行搞定,学 mr 还有啥意义
louxinbo
2018-08-27 08:07:00 +08:00
@billlee 感谢。这个是学校开的课。没办法改了。我的作业里除了要求差值,还要求平均数。所以我得把年份也一起放进 value,各个地点的年份也不完全一样,某些年份某 a 有数据,某些年份 b 有数据,我只取都有数据的年份计算差值,然后再计算差值之和的平均值。 另一个难点是 x 是地点 id,是一串字母+数字,不太好比较大小。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/483396

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX