Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6020
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-12 22:58
文章分类
文章存档

2013年(1)

我的朋友
最近访客

分类: HADOOP

2013-03-12 23:25:33

在使用hadoop进行计算时,经常遇到的一种场景就是拼接两个表,然后进行简单的处理,这种场景可以通过以下这种较为通用的逻辑来进行处理:

点击(此处)折叠或打开

  1. #-*- coding: gbk -*-

  2. import sys, string, gc
  3. def mapper() :
  4.     """
  5.     在query后加入A或B字段
  6.     """
  7.     for line in sys.stdin:
  8.         line = line.rstrip()
  9.         if line == '' :
  10.             continue
  11.         fields = line.split('\t')
  12.         fields_len = len(fields)
  13.         if fields_len == 4 :
  14.             print '%s\t%s' % (fields[0], 'A')
  15.         if fields_len > 50 :
  16.             print '%s\t%s\t%s' % (fields[11], 'B', fields[2])


  17. def reducer() :
  18.     """
  19.     合并
  20.     """
  21.     key = ''
  22.     value = 0
  23.     for line in sys.stdin :
  24.         line = line.rstrip()
  25.         if line == '' :
  26.             continue
  27.         fields = line.split('\t')
  28.         if len(fields) < 2 :
  29.             continue
  30.         if fields[1] == 'A' :
  31.             key = fields[0]
  32.         if fields[0] == key and fields[1] == 'B' :
  33.             value += string.atof(fields[2])

  34.     print 'final_sum : %.2f' % (value)

  35. if __name__ == '__main__' :
  36.     if(sys.argv[1] == 'map'):
  37.         mapper()
  38.     elif (sys.argv[1] == 'reduce'):
  39.         reducer()

mapper阶段:通过数据若干属性的不同进行区分并且标记;
                       在本例中是通过列数的不同,从而进行区分,并在第二列标记A,B,第一列的相同属性作为key,并根据需求输出reducer阶段所需的少数几个字段;
reducer阶段:利用hadoop以第一列作为key,对mapper结果进行排序后的顺序结果,进行简单的处理;
                       在本例中是通过先将A数据的第一列赋值给key,然后在B数据中第一列等于key的数据中,累加其第二列,最后输出所有累加值之和;
当然,该hadoop任务的执行需要配置特定的参数才行,下篇将对hadoop参数做简单的介绍,谢谢!

阅读(1048) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~