• 电商API接口的应用||大数据电商数仓分析项目||电商热门商品统计


    一、电商热门商品统计模块

    (1)需求分析

    1. 如何定义热门商品?

      • 简单模型:直接通过用户对商品的点击量来衡量商品热度。

      • 复杂模型:依据各类别权重(后续补充)

    2. 如何获取区域?

      • 通过用户点击日志,获取访问IP,进而获取区域信息。

      • 通过数据库中的订单关联用户表,获取用户的地域信息

    3. 如何去除爬虫水军(商家为了提高自己的排名,用爬虫来频繁访问自己的店铺)?

      • 一段时间分析用户IP的访问次数(后续补充)

    (2)技术方案

    1. 数据采集(ETL)电商API接口接入

      「因为要访问数据库,所以会对数据库造成很大的压力,而且在真实的生产环境中,一般没有权限直接访问数据库。可以把数据导出成csv文件,放到日志服务器上,再通过Flume采集到HDFS上。假如有权限访问数据库,数据库也需要设置成读写分离的模式,来缓解压力。」

      • 电商日志一般存储在日志服务器,通过 Flume 拉取到 HDFS 上,本文通过编写python程序模拟日志数据。

      • 业务数据通过 Sqoop 从关系型数据库mysql中读取数据,然后导入到HDFS。

    2. 数据清洗

      • 使用 MapReduce 进行数据清洗。

      • 使用 Spark Core 进行数据清洗。

    3. 各区域热门商品计算

      • 使用 Hive 进行数据的分析和处理。

      • 使用 Spark SQL 进行数据的分析和处理

    (3)实验数据及说明

    1. product(商品)表:

      列名描述数据类型空/非空约束
      product_id商品号varchar(18)Not null
      product_name商品名称varchar(20)Not null
      marque商品型号varchar(10)Not null
      barcode仓库条码varcharNot null
      price商品价格doubleNot null
      brand_id商品品牌varchar(8)Not null
      market_price市场价格doubleNot null
      stock库存intNot null
      status状态intNot null

      补充说明: status: 下架-1,上架0,预售1

    2. area_info(地区信息)表

      列名描述数据类型空/非空约束
      area_id地区编号varchar(18)Not null
      area_name地区名称varchar(20)Not null
    3. user_click_log(用户点击信息)表

      列名描述数据类型空/非空约束
      user_id用户IDvarchar(18)Not null
      user_ip用户IPvarchar(20)Not null
      url用户点击 URLvarchar(200)
      click_time用户点击时间varchar(40)
      action_type动作名称varchar(40)
      area_id地区IDvarchar(40)

      补充说明: action_type: 1 收藏,2 加购物车,3 购买 area_id:已经通过IP地址,解析出了区域信息

    4. area_hot_product(区域热门商品)表

      列名描述数据类型空/非空约束
      area_id地区IDvarchar(18)Not null
      area_name地区名称varchar(20)Not null
      product_id商品IDvarchar(200)
      product_name商品名称varchar(40)
      pv访问量BIGINT

    (4)技术实现

    使用Flume采集用户点击日志

    1. Flume配置文件(flume-areahot.conf)

      2.利用python编写程序模拟日志信息,jian放入/log0208文件夹下,自定义添加不符合字段数据,要经过mr或spark进行数据清洗。

      • 启动 Flume agent,在 Flume 的根目录下执行命令:bin/flume-ng agent -n a4 -f flume-areahot.conf -c conf -Dflume.root.logger=INFO,console

      • 再执行python dslog.py向 /log0208 目录里放入用户日志文件(实现方法:此处

      • Flume 会将 /log0208 目录下的文件采集到 hdfs://master:9000/flume/ 当天日期 目录下。

    「运行dslog.py程序如下:」

    1. #coding=utf-8
    2. import random
    3. import time
    4. iplist=[26,23,47,56,108,10,33,48,66,77,101,45,61,52,88,89,108,191,65,177,98,21,34,61,19,11,112,114]
    5. url = "http://mystore.jsp/?productid={query}"
    6. x=[1,2,3,4]
    7. def use_id():
    8.     return random.randint(1,20)
    9. def get_ip():
    10.     return '.'.join(str(x) for x in random.sample(iplist,4))
    11. def urllist():
    12. def sample_references():
    13.     if random.uniform(0,1)>0.8:
    14.         return ""
    15.     query_str=random.sample(x,1)
    16.     return url.format(query=query_str[0])
    17. def get_time():
    18.     return time.strftime('%Y%m%d%H%M%S',time.localtime())
    19. #  action: 1 收藏,2 加购物车,3 购买  area_id代表不同区域
    20. def action():
    21.     return random.randint(1,4)
    22. def area_id():
    23.     return random.randint(1,21)
    24. def get_log(count):
    25.     while count>0:
    26.         log='{},{},{},{},{},{}\n'.format(use_id(),get_ip(),urllist(),get_time(),action(),area_id())
    27.         # with open('/usr/local/src/tmp/1.log','a+')as file:
    28.         with open('/log0208/click.log','a+')as file:
    29.             file.write(log)
    30.         # print(log)
    31.         # time.sleep(1)
    32.         count=count-1
    33. if __name__ == '__main__':
    34.     get_log(10000)

    点击并拖拽以移动

    生成日志结果截取:

    1. 5,10.26.56.45,http://mystore.jsp/?productid=1,20210222005139,1,19
    2. 2,10.101.98.47,http://mystore.jsp/?productid=1,20210222005139,3,8
    3. 17,191.88.66.108,http://mystore.jsp/?productid=3,20210222005139,2,14
    4. 4,89.21.33.108,,20210222005139,2,10
    5. 4,108.23.48.114,http://mystore.jsp/?productid=4,20210222005139,1,21
    6. 8,21.48.19.65,,20210222005139,1,3
    7. 16,61.21.89.11,http://mystore.jsp/?productid=2,20210222005139,3,11
    8. 6,56.47.112.88,,20210222005139,1,3

    点击并拖拽以移动

    flume-areahot.conf配置文件如下:

    1. #bin/flume-ng agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO,console
    2. #定义agent名, source、channel、sink的名称
    3. a4.sources = r1
    4. a4.channels = c1
    5. a4.sinks = k1
    6. #具体定义source
    7. a4.sources.r1.type = spooldir
    8. a4.sources.r1.spoolDir = /log0208
    9. #具体定义channel
    10. a4.channels.c1.type = memory
    11. a4.channels.c1.capacity = 10000
    12. a4.channels.c1.transactionCapacity = 100 
    13. #定义拦截器,为消息添加时间戳
    14. a4.sources.r1.interceptors = i1
    15. a4.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
    16. #具体定义sink
    17. a4.sinks.k1.type = hdfs
    18. a4.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d
    19. a4.sinks.k1.hdfs.filePrefix = events-
    20. a4.sinks.k1.hdfs.fileType = DataStream
    21. #不按照条数生成文件
    22. a4.sinks.k1.hdfs.rollCount = 0 
    23. #HDFS上的文件达到128M时生成一个文件
    24. a4.sinks.k1.hdfs.rollSize = 134217728
    25. #HDFS上的文件达到60秒生成一个文件
    26. a4.sinks.k1.hdfs.rollInterval = 60
    27. #组装source、channel、sink
    28. a4.sources.r1.channels = c1
    29. a4.sinks.k1.channel = c1

    点击并拖拽以移动

    3.数据清洗

    • 需要将用户点击日志里面对于商品的点击识别出来

    • 过滤不满足6个字段的数据

    • 过滤URL为空的数据,即:过滤出包含http开头的日志记录

  • 相关阅读:
    基于OpenTelemetry实现Java微服务调用链跟踪
    (转)STR 内核做了什么
    【Java】缓冲流、转换流、序列化流
    java计算机毕业设计家电仓储管理系统源码+mysql数据库+系统+lw文档+部署
    NOIP2013普及组 车站分级
    【MySQL】索引(多角度深入讲解索引)
    [网络安全提高篇] 一二六.恶意软件分析之IDA Python基础用法及CFG控制流图提取详解[上]
    探索互联世界的灯光艺术:FastLED库详细介绍及应用实例
    vue3 如何给表单添加表单效验+正则表达式
    关于spring项目中,security 对websocket请求和拦截问题
  • 原文地址:https://blog.csdn.net/onebound_linda/article/details/138151899