最全【大数据学习篇10】Spark项目实战~网站转化率统计,网易C C++面试必问

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

Dataset userConversionDS = spark.read().json(arg[0]);

在文件PageConversion.java的main()方法中,调用DataSet的createOrReplaceTempView()方法,将userConversionDS创建为全局临时视图conversion_table。

userConversionDS.createOrReplaceTempView(“conversion_table”);

3.4  统计每个页面访问次数

在文件PageConversion.java的main()方法中,调用SparkSession的sql()方法统计每个页面访问次数,将统计结果加载到pageIdPvDS。

Dataset pageIdPvDS = spark

.sql("select pageid,count(*) as pageid_count " +

"from conversion_table " +

“group by pageid”);

3.5  获取每个用户浏览网页的顺序\

在文件PageConversion.java的main()方法中,调用SparkSession的sql()方法对每个用户浏览网页的顺序进行排序,将排序结果加载到useridGroupSortDS。

Dataset useridGroupSortDS = spark

.sql("select userid,actionTime,pageid " +

"from conversion_table " +

“order by userid,actionTime”);

在文件PageConversion.java的main()方法中,调用DataSet的createOrReplaceTempView()方法,将useridGroupSortDS创建为全局临时视图conversion_group_sort_table。

useridGroupSortDS.createOrReplaceTempView(“conversion_group_sort_table”);

3.6  合并同一用户浏览的网页

在文件PageConversion.java的main()方法中,调用SparkSession的sql()方法对同一用户浏览的网页进行合并,将合并结果加载到pageConversionRDD。为了后续使用flatMap()算子对合并后的数据进行扁平化处理,这里通过SparkSession的toJavaRDD()方法将DataSet转为JavaRDD。

JavaRDD pageConversionRDD = spark.sql(“select userid,” +     "concat_ws(‘,’,collect_list(pageid)) as column2s " +     "from conversion_group_sort_table " +     “group by userid”).toJavaRDD();

3.7  统计每个单跳的次数

在文件PageConversion.java的main()方法中,使用flatMap()算子对pageConversionRDD进行扁平化处理,根据用户浏览网页的顺序将相邻网页拼接为单跳,将处理结果加载到rowRDD。

JavaRDD rowRDD = pageConversionRDD.flatMap(new FlatMapFunction<Row, Row>() {     @Override     public Iterator call(Row row) throws Exception {

List list = new ArrayList<>();

String[] page = row.get(1).toString().split(“,”);

String pageConversionStr = “”;

for (int i = 0;i<page.length-1;i++){

if (!page[i].equals(page[i+1])){

pageConversionStr = page[i]+“_”+page[i+1];

list.add(RowFactory.create(pageConversionStr));

}

}

return list.iterator();

}

});

在文件PageConversion.java的main()方法中,调用SparkSession的createDataFrame()方法和 registerTempTable()方法,将存储单跳数据的rowRDD注册临时表page_conversion_table。

StructType schema = DataTypes.createStructType(new StructField[]{     DataTypes.createStructField( “page_conversion”,DataTypes.StringType,true)     }); spark.createDataFrame(rowRDD, schema).registerTempTable(“page_conversion_table”);

在文件PageConversion.java的main()方法中,使用SparkSession的sql()方法统计每个单跳的次数,根据统计结果创建全局临时视图page_conversion_count_table。

spark.sql(

“select page_conversion,” +

"count(*) as page_conversion_count " +

"from page_conversion_table " +

“group by page_conversion”)

.createOrReplaceTempView(“page_conversion_count_table”);

3.8  计算页面单跳转化率

通过页面单跳转化率的计算公式得知,若要计算单跳A→B的页面单跳转化率,首先需要获取页面A的访问次数,然后需要获取单跳A→B的次数,最终将这两部分数据代入页面单跳转化率的计算公式中计算单跳A→B的页面单跳转化率。 在计算每个单跳的页面单跳转化率之前,需要将每个页面与每个单跳进行一一对应,也就是说如果计算单跳A→B的页面单跳转化率,那么代入页面单跳转化率计算公式中的一定是页面A的访问次数,而不能是页面B或C的访问次数。

在文件PageConversion.java的main()方法中,使用SparkSession的sql()方法拆分单跳为起始页面和结束页面,将拆分后的数据加载到pageConversionCountDS。

Dataset pageConversionCountDS = spark

.sql(“select page_conversion_count,” +

“split(page_conversion,‘_’)[0] as start_page,” +

"split(page_conversion,‘_’)[1] as last_page " +

“from page_conversion_count_table”);

在文件PageConversion.java的main()方法中,使用join()算子对pageIdPvDS(存储每个页面访问的次数)和pageConversionCountDS(存储每个单跳拆分后的数据)进行连接,根据连接结果创建全局临时视图page_conversion_join。

pageConversionCountDS.join(

pageIdPvDS,

new Column(“start_page”).equalTo(new Column(“pageid”)),             “left”).createOrReplaceTempView(“page_conversion_join”);

在文件PageConversion.java的main()方法中,使用SparkSession的sql()计算页面单跳转化率,将计算结果加载到resultDS。

Dataset resultDS = spark .sql("select " +

“concat(pageid,‘_’,last_page) as conversion,” +

“round(” +

“CAST(page_conversion_count AS DOUBLE)/CAST(pageid_count AS DOUBLE)” +

",3) as rage " +

“from page_conversion_join”);

3.9  数据持久化

在PageConversion类中添加方法conversionToHBase(),用于将页面单跳转化率统计结果持久化到HBase数据库中,该方法包含参数dataset,表示需要向方法中传递页面单跳转化率统计结果数据。

public static void conversionToHBase(Dataset dataset) throws IOException {     HbaseUtils.createTable(“conversion”,“page_conversion”);

String[] column = {“convert_page”,“convert_rage”};

dataset.foreach(new ForeachFunction() {

@Override

public void call(Row row) throws Exception {

String conversion = row.get(0).toString();

String rage = row.get(1).toString();

String[] value ={conversion,rage};

HbaseUtils.putsToHBase(“conversion”,conversion+rage,“page_conversion”,column,value);

}

});

}

在文件PageConversion.java的main()方法中,调用conversionToHBase()方法并传入参数resultDS,用于在Spark SQL程序中实现conversionToHBase()方法,将页面单跳转化率统计结果数据持久化到HBase数据库中的数据表conversion。

try {

conversionToHBase(resultDS);

} catch (IOException e) {

e.printStackTrace(); }

HbaseConnect.closeConnection();

spark.close();

4.运行程序

在IntelliJ IDEA中将页面单跳转化率统计程序封装成jar包,并上传到集群环境中,通过spark-submit将程序提交到YARN中运行。

封装jar包:

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

将数据集上传到本地文件系统:

使用远程连接工具SecureCRT连接虚拟机Spark01,在存放数据文件的目录/export/data/SparkData/(该目录需提前创建)下执行“rz”命令,将数据集user_conversion.json上传至本地文件系统。

在HDFS创建存放数据集的目录:

将数据集上传到HDFS前,需要在HDFS的根目录创建目录page_conversion,用于存放数据集user_conversion.json。

hdfs dfs -mkdir /page_conversion

上传数据集到HDFS:

将目录/export/data/SparkData/下的数据集user_conversion.json上传到HDFS的page_conversion目录下,具体命令如下。

hdfs dfs -put /export/data/SparkData/user_conversion.json /page_conversion

提交页面单跳转化率统计程序到YARN集群:

通过Spark安装目录中bin目录下的shell脚本文件spark-submit提交页面单跳转化率统计程序到YARN集群运行。

spark-submit \

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ell脚本文件spark-submit提交页面单跳转化率统计程序到YARN集群运行。

spark-submit \

[外链图片转存中…(img-XzGWfPnu-1715822988896)]
[外链图片转存中…(img-O6CBWTKV-1715822988897)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值