【大数据学习篇9】各区域热门商品Top3分析

news2024/9/17 7:46:57

学习目标/Target

掌握各区域热门商品Top3分析实现思路

掌握如何创建Spark连接并读取数据集

掌握利用Spark获取业务数据

掌握利用Spark过滤商品的行为类型

掌握利用Spark转换数据格式

掌握利用Spark统计每个区域中的不同商品

掌握利用Spark根据区域进行分组

掌握利用Spark根据区域内商品的查看次数进行排序

掌握将数据持久化到HBase数据库

熟悉通过Spark On YARN运行程序

        用户在访问电商网站时,网站在存储用户行为数据的同时,还会通过IP地址或位置信息存储用户触发行为所在的区域数据。通过统计各区域不同商品被查看的次数,获取每个区域内比较热门的商品。本章将通过对电商网站存储的用户行为数据进行分析,从而统计出各区域排名前3的热门商品。

1. 实现思路分析

        获取数据集中所有用户数据,过滤出用户行为类型为查看的数据,通过商品被查看的次数为依据判断哪些商品属于热门商品。对过滤后的数据进行聚合操作,统计每个区域不同商品的查看次数。按照区域对聚合后的数据进行分组处理,将分组后的数据进行降序排序,获取各区域排名前3的商品,就是各区域热门商品Top3。

读取/转换:读取数据集中的区域名称(address_name)、行为类型(event_type)和商品ID(product_id)数据;

过滤:过滤行为类型为view(查看)的数据;

转换:便于后续聚合处理时,将相同Key的Value值进行累加,这里需要对数据格式进行转换处理,将区域名称和商品ID作为Key,值1作为Value。由于过滤后的数据行为类型都是查看,在后续的处理中便不再需要行为类型数据;

聚合:统计每个区域中不同商品的查看次数;

转换/分组:对数据格式进行转换,将区域名称作为Key,商品ID和商品被查看的次数作为Value。接下来,将转换后的数据根据Key进行分组,统计各个区域被查看的商品及每个商品查看的次数;

排序:对每一组数据的值进行排序,即对各个区域每个商品被查看的次数进行降序排序。 

2. 实现各区域热门商品Top3

2.1  创建Spark连接并读取数据集

        在项目SparkProject的 java目录新建Package包“cn.itcast.top3”,用于存放实现各区域热门商品Top3的Java文件。在包“cn.itcast.top3”中创建文件AreaProductTop3.java,用于实现各区域热门商品Top3。

public class AreaProductTop3{

    public static void main(String[] arg){

    //实现各区域热门商品Top3分析

    }f

}

        在main()方法中,创建JavaSparkContext和SparkConf对象,JavaSparkContext对象用于实现Spark程序,SparkConf对象用于配置Spark程序相关参数。        

SparkConf conf = new SparkConf(); //设置Application名称为top3_area_product conf.setAppName("top3_area_product"); JavaSparkContext sc = new JavaSparkContext(conf);

        在main()方法中,调用JavaSparkContext对象的textFile()方法读取外部文件,将文件中的数据加载到textFileRDD。

JavaRDD<String> textFileRDD = sc.textFile(arg[0]);

2.2 获取业务数据

        在main()方法中,使用mapToPair()算子转换textFileRDD的每一行数据,用于获取每一行数据中的行为类型、区域名称和商品ID数据,将转换结果加载到transProductRDD。

JavaPairRDD<Tuple2<String,String>,String> transProductRDD     = textFileRDD.mapToPair(new PairFunction<String,Tuple2<String, String>,String>() {    

@Override    

public Tuple2<Tuple2<String, String>, String> call(String s) throws Exception {

        JSONObject json = JSONObject.parseObject(s);

        String address_name = json.getString("address_name").replaceAll("\\u00A0+","");                 String product_id = json.getString("product_id");

        String event_type = json.getString("event_type");

        Tuple2<Tuple2<String,String>,String> tuple2 =                

        new Tuple2<>( new Tuple2<>(address_name,product_id), event_type);

        return tuple2;        

        }    

  });

2.3 过滤商品的行为类型

        在main()方法中,使用filter()算子过滤transProductRDD每一行数据中行为类型为加入购物车和购买的数据,只保留行为类型为查看的数据,将过滤结果加载到getViewRDD。

JavaPairRDD<Tuple2<String, String>, String> getViewRDD =

    transProductRDD.filter(new Function<Tuple2<

                            Tuple2<String, String>, String>, Boolean>() {

@Override

        public Boolean call(

                Tuple2<Tuple2<String, String>, String> tuple2)

                throws Exception {

            String event_type = tuple2._2;

            return event_type.equals("view");

         }    

 });

2.4  转换数据格式

        在main()方法中,使用mapToPair()算子转换getViewRDD的每一行数据,用于替换行为类型数据为1,将转换结果加载到productByAreaRDD。

JavaPairRDD<Tuple2<String,String>,Integer> productByAreaRDD =            getViewRDD.mapToPair(

               new PairFunction<Tuple2<Tuple2<String, String>, String>,

                         Tuple2<String, String>,

                         Integer>() {

@Override

       public Tuple2<Tuple2<String, String>, Integer> call(

               Tuple2<Tuple2<String, String>, String> tuple2)

               throws Exception {

           return new Tuple2<>(tuple2._1,new Integer(1));

       }

   });

2.5  统计每个区域中的不同商品

        在main()方法中,使用reduceByKey()算子对productByAreaRDD进行聚合操作,用于统计每个区域中不同商品的查看次数,将统计结果加载到productCountByAreaRDD。

JavaPairRDD<Tuple2<String,String>,Integer> productCountByAreaRDD =         productByAreaRDD.reduceByKey(

                new Function2<Integer, Integer, Integer>() {

@Override

    public Integer call(Integer integer, Integer integer2)

            throws Exception {

        return integer+integer2;

    }

});

2.6 根据区域进行分组

        在main()方法中,使用mapToPair()算子转换productCountByAreaRDD的每一行数据,将转换结果加载到transProductCountByAreaRDD

JavaPairRDD<String,Tuple2<String,Integer>> transProductCountByAreaRDD =productCountByAreaRDD.mapToPair(new PairFunction<Tuple2<Tuple2<String, String>, Integer>,String, Tuple2<String, Integer>>() {            

@Override

            public Tuple2<String, Tuple2<String, Integer>> call(Tuple2<Tuple2<String, String>, Integer> tuple2) throws Exception {

                return new Tuple2<>(tuple2._1._1, new Tuple2<>(tuple2._1._2,tuple2._2));

            }

        });

        在main()方法中,使用groupByKey()算子对transProductCountByAreaRDD进行分组操作,将同一区域内的商品以及商品被查看的次数合并在一起,通过productGroupByAreaRDD加载分组结果。

JavaPairRDD<String, Iterable<Tuple2<String, Integer>>>

         productGroupByAreaRDD = transProductCountByAreaRDD.groupByKey();

2.7 根据区域内商品的查看次数进行排序

        在main()方法中,使用mapToPair()算子转换productGroupByAreaRDD的每一行数据,将同一区域内的商品按照商品被查看的次数进行逆序排序,通过productSortByAreaRDD加载排序结果。

JavaPairRDD<String, Iterable<Tuple2<String, Integer>>> productSortByAreaRDD =productGroupByAreaRDD

           .mapToPair( new PairFunction<Tuple2<String, Iterable<Tuple2<String, Integer>>>,String,Iterable<Tuple2<String, Integer>>>() {

@Override

    public Tuple2<String, Iterable<Tuple2<String, Integer>>> call(Tuple2<String, Iterable<Tuple2<String, Integer>>> tuple2)

             throws Exception {

                                          List<Tuple2<String,Integer>> list = new ArrayList<>();                                                              Iterator<Tuple2<String,Integer>> iter = tuple2._2.iterator();                                                              while (iter.hasNext()){

                                         list.add(iter.next());

                   }

                   list.sort(new Comparator<Tuple2<String, Integer>>() {

@Override

                   public int compare(Tuple2<String, Integer> o1,Tuple2<String, Integer> o2) {

        return o2._2 - o1._2;

                  

}     

});   

 return new Tuple2<>(tuple2._1,list);

    }          

 });

2.8 数据持久化

获取各区域热门商品Top3数据

在类AreaProductTop3的main()方法中,使用mapToPair()算子转换productSortByAreaRDD的每一行数据,获取每个区域排名前3的商品,通过productSortByAreaRDD加载转换结果。

JavaPairRDD<String, Iterable<Tuple2<String, Integer>>> top3AreaProductRDD=productSortByAreaRDD.mapToPair(new PairFunction<Tuple2<String, Iterable<Tuple2<String, Integer>>>,String,Iterable<Tuple2<String, Integer>>>() {    

@Override

    public Tuple2<String, Iterable<Tuple2<String, Integer>>> call(Tuple2<String, Iterable<Tuple2<String, Integer>>> tuple2) throws Exception {

        List<Tuple2<String,Integer>> list = new ArrayList<>();

        Iterator<Tuple2<String,Integer>> iter = tuple2._2.iterator();

        int i = 0;

        while (iter.hasNext()){

            list.add(iter.next());

            i++;

            if (i == 3){

                break;

            }

        }

        return new Tuple2<>(tuple2._1,list);

    }

});

持久化各区域热门商品Top3数据

        在类AreaProductTop3的main()方法中,添加方法top3ToHbase(),用于将各区域热门商品Top3分析结果持久化到HBase数据库中,该方法包含参数rdd,表示各区域热门商品Top3分析结果数据。

public static void top3ToHbase(JavaPairRDD<String, Iterable<Tuple2<String, Integer>>> rdd) throws IOException {

}

        在方法top3ToHbase()中创建数据表top3和列族top3_area_product,并且创建数组column用于存储数据表top3的列名。

HbaseUtils.createTable("top3","top3_area_product");  

String[] column ={"area","product_id","viewcount"};

持久化各区域热门商品Top3数据

在方法top3ToHbase()中通过foreach()算子遍历各区域热门商品Top3分析结果数据。

rdd.foreach(new VoidFunction<Tuple2<String,Iterable<Tuple2<String, Integer>>>>()

        {

@Override

 public void call(Tuple2<String, Iterable<Tuple2<String, Integer>>> tuple2) throws Exception {                 String area = tuple2._1,product_id = "",viewcount = "";

                Iterator<Tuple2<String,Integer>> iter = tuple2._2.iterator();

                List<Tuple2<String,Integer>> myList = Lists.newArrayList(iter);

                for (Tuple2<String,Integer> tuple : myList) {

                    product_id = tuple._1;

                    viewcount = String.valueOf(tuple._2);

                    String [] value =  {area,product_id,viewcount};

                    try {                                 HbaseUtils.putsToHBase("top3",area+product_id,"top3_area_product",column,value);                     } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            }

        });

}

        在类AreaProductTop3的main()方法中,调用top3ToHbase()方法并传入参数top3AreaProductRDD,用于在Spark程序中实现top3ToHbase()方法,将各区域热门商品Top3分析结果持久化到HBase数据库中的数据表top3。

try {

    top3ToHbase(top3AreaProductRDD);

        } catch (IOException e) {

    e.printStackTrace();

}

HbaseConnect.closeConnection();

sc.close();

3. 运行程序

        在IntelliJ IDEA中将各区域热门商品Top3分析程序封装成jar包,并上传到集群环境中,通过spark-submit将程序提交到YARN中运行。

封装jar包:

        由于在封装热门品类Top10分析程序jar包时,将程序主类指向了“cn.itcast.top10.CategoryTop10”,因此这里需要将pom.xml文件中的程序主类修改为“cn.itcast.top3.AreaProductTop3”。根据封装热门品类Top10分析程序jar包的方式封装各区域热门商品Top3分析程序。将封装完成的jar包重命名为“AreaProductTop3”,通过远程连接工具SecureCRT将AreaProductTop3.jar上传到虚拟机Spark01的/export/SparkJar/目录下。

提交各区域热门商品Top3分析程序到YARN集群

通过Spark安装目录中bin目录下的shell脚本文件spark-submit提交各区域热门商品Top3分析程序到YARN集群运行。

 查看程序运行结果:

在虚拟机Spark01执行“hbase shell”命令,进入HBase命令行工具。

 在HBase命令行工具中执行“list”命令,查看HBase数据库中的所有数据表。

> list TABLE                                                                                      

test                                                                                        

top10 top3                                                                                

2 row(s) in 0.1810 seconds

在HBase命令行工具执行“scan 'top3'”命令,查看数据表top3中所有数据。

        本文主要讲解了如何通过用户行为数据实现各区域热门商品Top3分析,首先通过分析实现思路,使读者了解各区域热门商品Top3分析的实现流程。然后通过IntelliJ IDEA开发工具实现各区域热门商品Top3分析程序并将分析结果存储到HBase数据库,使读者掌握运用Java语言编写Spark Core和HBase程序的能力。最后封装各区域热门商品Top3分析程序并提交到集群运行,使读者掌握运用IntelliJ IDEA开发工具封装Spark Core程序以及Spark ON YARN模式运行Spark Core程序的方法。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的tail,grep,sed命令总结,以使用上述三种命令获取日志信息为例

目录 tail命令语法说明基本参数命令举例 grep命令语法说明匹配模式选择杂项输入控制文件控制 sed命令语法格式举例 使用命令组合查询日志信息 业务需求需要对软件日志进行查询和呈现&#xff0c;查询的条件是时间区间和关键词&#xff0c;系统运行在linux环境下&#xff0c;为此…

阿里巴巴“高并发”核心笔记!《基础+实战+源码+面试+架构》

前言 作为一个普普通通的程序员&#xff0c;如何才能提升自己的能力&#xff0c;在职场上拥有一技之长&#xff0c;这也成为普通的你我&#xff0c;迫切的需求。 拥有什么样的能力才能不被淘汰&#xff1f;答案是&#xff1a;高并发&#xff0c;它几乎成为了每个程序员都想要…

ATTCK v13版本战术介绍——防御规避(六)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第31-36种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

还只是停留在听过KMP算法?保姆式分析让你吃透KMP算法

&#x1f495;成功不是将来才有的&#xff0c;而是从决定去做的那一刻起&#xff0c;持续积累而成。&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;Java学习&#x1f386; &#x1f697;本文章主要内容&#xff1a;深…

腾讯云,物联网开发平台产品,动态注册步骤

1. 下载后解压&#xff0c;qcloud_iot_mqtt_sign-master.zip GitHub - tencentyun/qcloud_iot_mqtt_signContribute to tencentyun/qcloud_iot_mqtt_sign development by creating an account on GitHub.https://github.com/tencentyun/qcloud_iot_mqtt_sign 2. 按照readme文…

图像噪声类型:椒盐噪声,随机噪声,高斯噪声,泊松噪声,异方差高斯噪声模型和参数估计

文章目录 noise type1. 高斯噪声和泊松噪声2. 高斯分布和泊松分布的差异&#xff1a;3. 异方差高斯 噪声模型&#xff08;泊松和高斯噪声混合&#xff09;4. 几种噪声模型5. 信噪比 SNR的计算方法是6. Practical Poissonian-Gaussian noise modeling and fitting for single-im…

【嵌入式烧录刷写文件】-2.4-移动Intel Hex中指定地址范围内的数据

案例背景&#xff08;共5页精讲&#xff09;&#xff1a; 有如下一段Hex文件&#xff0c;将源地址范围0x9100-0x9104中数据&#xff0c;移动至一个“空的&#xff0c;未填充的”目标地址范围0xA000-0xA004。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717…

Cube Map 系列之:手把手教你 实现天空盒(Sky Box)

什么是天空盒 An skybox is a box with textures on it to look like the sky in all directions or rather to look like what is very far away including the horizon.天空盒是一个使用纹理贴图构建的盒子&#xff0c;人在其中朝任何一个方向看去&#xff0c;其纹理彷佛天空…

Java版本企业工程管理系统软件源码 自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Linux【工具 02】OpenStreetMap数据处理工具OSMCTools下载安装使用举例(osmconvert命令说明)

OSMCTools安装使用实例 1.Tools2.官网安装步骤3.实际安装步骤3.1 环境3.2 步骤 4.工具使用实例 OpenStreetMap的下载地址&#xff1a;Geofabrik Download Server。 OSMCTools的GitHub地址&#xff1a;https://github.com/ramunasd/osmctools Windows操作系统&#xff0c;可以…

MyBatis之注解开发

除了XML映射方式&#xff0c;MyBatis还支持注解方式实现POJO对象和数据表之间的关联映射&#xff0c;使用注解的方式一般将SQL语句直接写到接口上。与XML的映射方式相比&#xff0c;基于注解的映射方式相对简单。Mybatis提供的注解有&#xff1a; 1.环境准备 1.1 数据库准备…

C语言函数大全-- _w 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wmkdir 1.1 函数说明 函数声明函数功能int _wmkdir(const wchar_t* dirname);用于创建指定路径名的新目录 参数&#xff1a; dirname &#xff1a; 指向以 null 结尾的宽字符数组&#xff0c;该数组包含要创建的目…

客户管理系统软件怎么用?

阅读本文您将了解&#xff1a;1.客户管理系统的作用&#xff1b;2.客户管理系统软件怎么用&#xff1b;3.客户管理的注意事项。 一、客户管理系统的作用 客户是企业的重要财富&#xff0c;因此客户管理是企业发展过程中至关重要的一部分&#xff0c;那么客户管理怎么做&#…

《编码——隐匿在计算机软硬件背后的语言》精炼——第17章收尾

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼 文章目录 数字计算机硬件软件 数字计算机 数字计算机分为硬件和软件两部分&#xff0c;硬件是组成计算机的设备&#xff0c;软件是输入计算机的指令和数值。之所以将它们区分&#xff0c;是因为相对于硬件而言&…

照片从安卓手机中消失了?让他们恢复回来的几个方法请收好

“我安卓上的所有照片都消失了&#xff0c;我的照片去哪儿了” “我安卓上的所有照片都不见了” “下载的图片从安卓上消失了” …… 您是否遇到类似的问题&#xff1f;导致Android手机照片丢失的原因有很多&#xff0c;例如软件更新、误删、误操作、系统崩溃、应用程序崩溃、…

【算法】——动态规划题目讲解

本期继续为大家带来的是关于动态规划类题目的讲解&#xff0c;对于这类题目大家一定要多加练习&#xff0c;争取掌握。 &#xff08;一&#xff09;不同路径 链接如下&#xff1a;62. 不同路径 题目如下&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于这种「…

【FMC200】基于FMC标准的1路CameraLink Full 输出子卡模块

产品概述 FMC200是一款CameraLink发送FMC子卡模块&#xff0c;该模块支持2路CameraLink Base模式或者1路CameraLink Full模式的图像信号输出。板卡具有2个CameraLink端口&#xff08;SDR26&#xff09;&#xff0c;可以作为模拟相机的输出。 技术指标 图像接口性能&#xff1a…

202305-第二周资讯

山川软件愿为您提供最优质的服务。 您的每一个疑问都会被认真对待&#xff0c;您的每一个建议都将都会仔细思考。 我们希望人人都能分析大数据&#xff0c;人人都能搭建应用。 因此我们将不断完善DEMO、文档、以及视频&#xff0c;期望能在最大程度上快速帮助用户快速解决问…

高效易懂,打造维护性好的Web自动化测试框架PO模式精讲

目录 前言&#xff1a; 一、 PO概述 二、PO何实现于Web框架素自动化测试重中之重。 1.为了保证易维护性和易读性&#xff0c;我们可以在项目中定义一个统一的库&#xff0c;用来存放所有的定位器类。 2.定义一个基础的类&#xff0c;该类用于针对PO的元素定位进行封装。 3…

Visual Studio 2022 17.7 发布首个预览版

Visual Studio 2022 17.7 已发布首个预览版&#xff0c;这个版本有大量社区贡献的新改进&#xff0c;主要改动如下&#xff1a; 生产效率 文件对比功能&#xff0c;可以在 Solution Explorer 中对比不同的文件差异。在资源管理器中右键单击一个文件&#xff0c;然后使用上下文…