3.4 MRJOB 文件合并

news/2024/11/29 7:58:15/

需求描述

  • 两个文件合并 类似于数据库中的两张表合并
uid uname
01 user1 
02 user2
03 user3
uid orderid order_price
01   01     80
01   02     90
02   03    82
02   04    95

mrjob 实现

实现对两个数据表进行join操作,显示效果为每个用户的所有订单信息

"01:user1"	"01:80,02:90"
"02:user2"	"03:82,04:95"
from mrjob.job import MRJob
import os
import sys
class UserOrderJoin(MRJob):SORT_VALUES = True# 二次排序参数:http://mrjob.readthedocs.io/en/latest/job.htmldef mapper(self, _, line):fields = line.strip().split('\t')if len(fields) == 2:# user datasource = 'A'user_id = fields[0]user_name = fields[1]yield  user_id,[source,user_name] # 01 [A,user1]elif len(fields) == 3:# order datasource ='B'user_id = fields[0]order_id = fields[1]price = fields[2]yield user_id,[source,order_id,price] #01 ['B',01,80]['B',02,90]else :passdef reducer(self,user_id,values):'''每个用户的订单列表"01:user1"	"01:80,02:90""02:user2"	"03:82,04:95":param user_id::param values:[A,user1]  ['B',01,80]:return:'''values = [v for v in values]if len(values)>1 :user_name = values[0][1]order_info = [':'.join([v[1],v[2]]) for v in values[1:]] #[01:80,02:90]yield ':'.join([user_id,user_name]),','.join(order_info)def main():UserOrderJoin.run()if __name__ == '__main__':main()

实现对两个数据表进行join操作,显示效果为每个用户所下订单的订单总量和累计消费金额

"01:user1"	[2, 170]
"02:user2"	[2, 177]
from mrjob.job import MRJob
import os
import sys
class UserOrderJoin(MRJob):# 二次排序参数:http://mrjob.readthedocs.io/en/latest/job.htmlSORT_VALUES = Truedef mapper(self, _, line):fields = line.strip().split('\t')if len(fields) == 2:# user datasource = 'A'user_id = fields[0]user_name = fields[1]yield  user_id,[source,user_name]elif len(fields) == 3:# order datasource ='B'user_id = fields[0]order_id = fields[1]price = fields[2]yield user_id,[source,order_id,price]else :passdef reducer(self,user_id,values):'''统计每个用户的订单数量和累计消费金额:param user_id::param values::return:'''values = [v for v in values]user_name = Noneorder_cnt = 0order_sum = 0if len(values)>1:for v in values:if len(v) ==  2 :user_name = v[1]elif len(v) == 3:order_cnt += 1order_sum += int(v[2])yield ":".join([user_id,user_name]),(order_cnt,order_sum)def main():UserOrderJoin().run()if __name__ == '__main__':main()	

http://www.ppmy.cn/news/624846.html

相关文章

车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...

前阵子买了个电子湿温度计,使用1节7号电池,加上家里使用天然气后,使用的燃气灶用的是1节1号电池,就翻了一下吃灰的备件,发现了这两个物件,iCharge车充和不知名的LED头灯电路板散件,就利用上了。iCharge车充采用美国泰德Techcode的TD1410降压芯片,效率高、结构简单,改装…

*铝燃料电池*收集

话说铝燃料电池(6):铝燃料电池技术参数及优势 来源:中国有色金属报 作者:王祝堂时间:2017-09-12 13:44 点击:213次 导语:铝燃料电池具有比能量大、成本较低、更换方便、绿色环保、安全可靠、适用性强、可长时间运行、生成物可全…

IntelliJ IDEA - 通过依赖名查找 Pom.xml 引入的源头坐标

问题描述 今天在新建项目的时候,发现一个注解(JsonInclude)不知道是哪个包的源头引入的,后来打开原来的老项目,查看对应的源文件,发现如图所示 但是这个 com.fasterxml.jackson.core:jackson-annotations:…

本田全新雅阁预售,配全液晶仪表和多项驾驶辅助功能

车控快讯(文/每日一CHEK)本田第11代雅阁限量盲订,5月20日正式上市。全新设计包括更年轻化和运动感的外观、多项驾驶辅助功能和本田有史以来最大的中控屏。车尾设计搭配大溜背和贯穿式LED尾灯,内饰采用12.3英寸悬浮式中控屏和10.2英…

ubuntu上升级python从python3.7到python3.8

文章目录 一、安装python3.81. 更新 apt-get 软件源:输入以下命令:2. 安装 Python 3.8:输入以下命令: 二、修改软链接1. 删除软连接2. 新建软连接 三、 安装对应pip 一、安装python3.8 1. 更新 apt-get 软件源:输入以…

全新雅阁登场,广汽本田突破插混价格,17.98万起

车控快讯(文/每日一CHEK)广汽本田今日发布第十一代雅阁,官方指导价区间为17.98万-25.88万。 新车提供4款锐T动和3款e:PHEV车型,并附赠多项购车礼遇。第四代i-MMD PHEV系统、Honda CONNECT 4.0智导互联系统和Honda SENSING 360安全…

没有大概全是具体内容 本田雅阁置换啥车 自己看看吧

其实啥都不用多说,这个也就是一段简单的故事,记录着我的一些简单的经历,说说一些简单的道理,很简单!! 关注雅阁很久了,从7代就开始对他有好感,八代的时候有冲动要换车,八…

本田雅阁 2022款混动 2.0L E-CVT 锐酷版这款车怎么样?

本田雅阁 2022款混动 2.0L E-CVT 锐酷版,作为一款高端中型轿车,以其出色的性能和豪华的内饰,吸引了众多消费者的关注。而本田家族的汽车性能,作为新车友可能比较陌生,但老车友却能如数家珍,现在就这款车写些…