将给定数据的app的标签进行一个热度排序
数据格式如下:
com.letv.android.client 乐视视频 软件 图像影音 视频 com.letv.android.client.pad 乐视视频HD 软件 图像影音 视频 体育, com.letv.tvos.appstore 乐视应用商店 软件 系统性能 工具 搜索, com.telecom.video.lsysdx 乐视影视电信版 软件 图像影音 视频 com.letv.cloud.disk 乐视云盘 软件 办公商务 存储 乐视, com.wuba 58同城 软件 通信社交 社交 租房,周边信息,生活服务,招聘,实用工具,生活,同城,求职,二手物品,房产, com.godyj.lottery 彩票大赢家2015 软件 金融理财 彩票 票务, com.sankuai.movie 猫眼电影 软件 便捷生活 生活 团购,视频,优惠,购票,购物,选座,娱乐,影院,电影票,
数据最后一列是以逗号分隔的app标签,需要将所有的app标签进行一个热度的排序
- 使用split按照逗号将数据切分成数组格式
- 然后使用行转列函数explode将数据进行转列
- 使用lateral view 将行转列的数据横向添加到表中方便查询
- 使用group by 加上order by 对标签进行合并统计产生一张标签和标签数量排好序的表
- 将上述的表使用over函数和rank函数进行一个排名追加到结果表中,到此任务完成
select tag,num,rank() over(order by num desc) rank from ( select tag,count(1) num from app_abstract_info lateral view explode(split(tags,',')) tag_table as tag where tag != '' and tag != '-' group by tag order by num desc ) rank_table limit 10;二.技术栈
- hive 基础
- 常用的建表语句
- 将hdfs的数据导入到hive中
- hive 中的数据分析函数
- 窗口函数 over()
- 数据的行转列 explode
- 将行转列的数据转换成一个表 lateral view
- 排序函数 rank() row_number() dense_rank()
- hive shell脚本的使用
- udf
在测试的过程中发现,最后一列的数据如果按照逗号分隔的话会出现很多空字符串和"-"
如下:
select tag,count(1) num from app_abstract_info lateral view explode(split(tags,',')) tag_table as tag group by tag order by num desc limit 10;
在这里插入图片描述
解决方法:
- 使用where进行数据的筛选
select tag,count(1) num from app_abstract_info lateral view explode(split(tags,',')) tag_table as tag where tag != '' and tag != '-' group by tag order by num desc limit 10;
- 自定义split函数,将空串和"-"去掉
package com.antg.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.ArrayList;
public class MySplit extends UDF {
public ArrayList evaluate(String input){
String[] split = input.split(",");
ArrayList result = new ArrayList<>();
for (String s : split) {
if(s.length()!=0&&!s.equals("-")){
result.add(s);
}
}
return result;
}
}
2.自定义udf返回Array数据类型
这个地方卡了很久
尝试过返回值是String[],失败了
返回值是String然后将数据拼接成array数据的格式 失败了
尝试过返回List 失败了
谷歌百度了很久也没有找到一个满意的答案
最后在上床后躺那刷csdn,终于在csdn上找到了一篇文章说是返回值是ArrayList
- create 存放建表语句
- deal 存放数据处理的语句
- data 存放需要处理的数据
- conf 存放配置文件
- udf 存放自定义的函数
虽然有些文件在项目中没有用到,但是为了规范性和以后的维护方便所以这些文件创建很有必要
2.开发流程- 项目概述,需要了解项目的大概背景
- 需求分析,对数据的输入输出格式进行对齐
- 技术方案选型,对需要解决的需求进行大体的技术选型,注意:能用sql解决的就不用java,这样方便以后的维护
- 确定开发计划(什么事由什么人在什么时间完成)
- 细节开发(大体任务分配后,由每个人确定自己的开发细节)
- 代码优化与标准化
- 正式上线
https://gitee.com/antgcode/app_hot_rank



