一、数据准备
本文主要是作为一个PySpark的入手实例来做,数据来源网络。主要用到两个数据文件:action.txt,document.txt。下表为action.txt,数据格式:userid~docid~behaivor~time~ip,即:用户编码~文档编码~行为~日期~IP地址
![1265cdd9cfcc95a4a94f8e7684ed08f9.png](https://i-blog.csdnimg.cn/blog_migrate/baf9868b49d1241b6645c2c071b086c3.jpeg)
下表为document.txt,数据格式:docid~channelname~source~keyword:score,即:文档编码~类别(大类)~主题(细类)~关键词:权重
![118df16a6b2decfe7e72ea350bd4570a.png](https://i-blog.csdnimg.cn/blog_migrate/cecf17415dcecb3e60b3fee872fa4aea.jpeg)
二、用户点击率
用户点击率即为action.txt文件中每个用户behaivor列中1的数量除以0的数量。
1、创建SparkSession对象
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
2、读取数据,将数据根据‘~’拆分,获取userid和behavior两列
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
click_rate1数据如下:
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
3、统计用户的各类行为数
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
click_rate2数据如下:
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
4、将userid,behavior和数量取出作为3列,并转为DataFrame格式
![5f4a7d8cff4fea41ed2c4931b44e8d3c.png](https://i-blog.csdnimg.cn/blog_migrate/3ace35910a3fdf02e7c1f9fa49253228.jpeg)
click_rate3_df数据如下:
![d3368e81be8a03bbe627fe0a81660d33.png](https://i-blog.csdnimg.cn/blog_migrate/20395e2777a3dd53cd78e54958f8d268.jpeg)
5、根据userId进行分组,将behavior列数据进行旋转作为列标数值为cnt。并将behavior的0和1替换为“browse”和”click”。
![ed23edec3c58a39eabcf58e4b354b1be.png](https://i-blog.csdnimg.cn/blog_migrate/1fe2d764717caee51830dd310317fecb.jpeg)
click_rate5数据如下:
![d6aaeb078fa4c03def6f42b8020513ae.png](https://i-blog.csdnimg.cn/blog_migrate/ba3f4331b4431f79115d39a87698c8ec.jpeg)
6、填充缺失值
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
click_rate6数据如下:
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
7、将计算的数据作为新列添加到数据
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
click_rate数据如下:
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
8、将最后处理的数据保存到本地,关闭SparkSession
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
最后保存到本地的数据为多个文件,每个文件的格式如下:
![3ffc74ad3f6b0a1b5e861aae2c39b354.png](https://i-blog.csdnimg.cn/blog_migrate/a0db45be37ec1dd04b0d9ccc843becaa.jpeg)
![679460f7e59ac4579c7b56b2eb042ccd.png](https://i-blog.csdnimg.cn/blog_migrate/51dac752988b95df3a5580af91b90aae.jpeg)
三、用户标签
使用主题(细类)给用户打标签
1、读取docunment.txt,获取docid、source两列,即文档编码和主题(细类)两列
![f9424d8b34c4a74b26fedf8b60b40f82.png](https://i-blog.csdnimg.cn/blog_migrate/d3f3690940a53aa618f02f6220808888.jpeg)
sources_df数据如下:
![a22d829f97c19eefe9882de3b13e0eb3.png](https://i-blog.csdnimg.cn/blog_migrate/c2824ea45e43f5a310386dd1c2f331f8.jpeg)
2、读取action.txt,只获取具有点击行为的userid和docid数据,即behavior为1的数据。
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
actions_df数据如下:
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
3、创建两个DataFrame的临时视图
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
4、进行关联查询
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
interestTags数据如下:
![d39bd1020b5fe03edce9dcee95752759.png](https://i-blog.csdnimg.cn/blog_migrate/8b354afc7c7b6ffd5693299bd385d8f2.png)
5、将最后处理的数据保存到本地,关闭SparkSession
![34d37469dac908a45f7c27e42608dd6d.png](https://i-blog.csdnimg.cn/blog_migrate/371aff026a365c1a423e773df5d003a3.jpeg)
导出后的数据如下:
![c54446e5eab7a5637b48eda064bb1dc5.png](https://i-blog.csdnimg.cn/blog_migrate/59352f8fa9675acc1910cfda40d49e4b.jpeg)
踩雷点:
1、代码开发时,可以每个操作跟一个action,方便查看数据,跑批的时候不需要每个都跟,只需要最后一个action,否则会给机器增加很多工作量。
2、中间过程生成的DataFrame必须先建立临时视图,后面才能使用,否则会报错