MapReduce实现订单商品的统计

mapreduce功能强大,可以处理大量离线数据。业务场景是要统计每个订单中数量情况,并将对应的商品id抽取出来。

数据格式为.csv文件,类型如下所示:

order_id,product_id,add_to_cart_order,reordered
1,49302,1,1
1,11109,2,1
1,10246,3,0
1,49683,4,0
1,43633,5,1
1,13176,6,0
1,47209,7,0
1,22035,8,1
36,39612,1,0
36,19660,2,1
36,49235,3,0
36,43086,4,1
36,46620,5,1
36,34497,6,1
36,48679,7,1
36,46979,8,1
38,11913,1,0
38,18159,2,0
38,4461,3,0
38,21616,4,1
38,23622,5,0
38,32433,6,0
38,28842,7,0
38,42625,8,0
38,39693,9,0

生成的结果格式

1       49302_11109_10246_49683_43633_13176_47209_22035	8
36      39612_19660_49235_43086_46620_34497_48679_46979 8
38      11913_18159_4461_21616_23622_32433_28842_42625_39693    9
数据预处理:需去除.csv文件第一行的表头
sed 1d  order_products.csv > order_produc.csv

map函数:对数据进行转换

import sys

for line in sys.stdin:
    id_list = line.strip().split(',')
    if len(id_list) != 4:
        continue
    order_id, product_id = id_list[0], id_list[1]
    print '%s\t%s\t%d'%(order_id, product_id, 1)

reduce函数:对数据归并

import sys

cur_order_id = None
cur_product_id = ''
sum_cnt = 0
for line in sys.stdin:
    order_id, product_id, count = line.strip().split('\t')
    if cur_order_id == None:
        cur_order_id = order_id
    if cur_order_id != order_id:
        print '%s\t%s\t%d'%(cur_order_id, cur_product_id, sum_cnt)
        cur_order_id = order_id
        sum_cnt = 0
        cur_product_id = ''
    sum_cnt += int(count)
    if cur_product_id == '':
        cur_product_id = product_id    #判断条件,若product_id只有一个,避免出现_product_id的情况
    else:
        cur_product_id = cur_product_id + '_' + product_id
print '%s\t%s\t%d'%(cur_order_id, cur_product_id, sum_cnt)

本地调试代码

cat order_produc.csv |python map.py | sort -k1 | python red.py 

跑完之后的部分结果



思考与拓展:

(1)上述数据可以作为跑模型的训练数据。

扫描二维码关注公众号,回复: 4148707 查看本文章

(2)针对这些数据可以计算商品的相似度。

(3)若有的订单数量很多,可以将对应的用户关联出来,做成user_id,product_id的形式。

(4)对订单求最大值、最小值、平均值,可以描述出用户的消费水平。

(5)可以通过订单数量对数据进行筛选,如有的数量为1,没有什么实际意义,可以将这些记录删除。

猜你喜欢

转载自blog.csdn.net/qq_38332574/article/details/80357767