V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
louxinbo
V2EX  ›  程序员

hadoop 如何计算相似度

  •  
  •   louxinbo · 2018-08-26 20:58:23 +08:00 · 2076 次点击
    这是一个创建于 2270 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚学 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
    3 条回复    2018-08-27 08:07:00 +08:00
    billlee
        1
    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
        2
    liprais  
       2018-08-26 23:19:16 +08:00
    spark sql 一行搞定,学 mr 还有啥意义
    louxinbo
        3
    louxinbo  
    OP
       2018-08-27 08:07:00 +08:00 via Android
    @billlee 感谢。这个是学校开的课。没办法改了。我的作业里除了要求差值,还要求平均数。所以我得把年份也一起放进 value,各个地点的年份也不完全一样,某些年份某 a 有数据,某些年份 b 有数据,我只取都有数据的年份计算差值,然后再计算差值之和的平均值。 另一个难点是 x 是地点 id,是一串字母+数字,不太好比较大小。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1526 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:58 · PVG 07:58 · LAX 15:58 · JFK 18:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.