消费行为分析
运行zeppelin
需求概述
对某零售企业最近1年门店收集的数据进行数据分析
潜在客户画像
用户消费统计
门店的资源利用率
消费的特征人群定位
数据的可视化展现
环境设置-zeppelin
数据结构
customer表
language字段数据存在错误
transaction表
表中transaction_id有重复,但数据有效,需要修复数据
store表
review表
表中无效的score数据表中有将transaction_id映射到错误的store_id
customer_details、transaction_details、store_details、store_review
检查行数和header行
上传数据到hdfs
创建适当的外部表来保存数据
数据获取
查看并了解数据
数据清洗
建新表
对transaction_details中的重复数据生成新ID
过滤掉store_review中没有评分的数据
可以把清洗好的数据放到另一个表或者用View表示
找出PII (personal information identification) 或PCI (personal confidential information) 数据进行加密或hash
重新组织transaction数据按照日期YYYY-MM做分区
md5单向加密,保证数据的有效性
where语句都是向左执行的
插入清洗后的数据
insert into 增量导入
insert overwrite 全量导入
基于hive的数据分析
customer_details表
6.1找出顾客最常用的信用卡
6.2找出客户资料中排名前五的职位名称
6.3在美国女性最常用的信用卡
6.4按性别和国家进行客户统计
transaction_details表
// 7.1 计算每个月总收入
select concat(year,'-',month) as ym,round(sum(price),2) as totalptice from transaction_details group by concat(year,'-',month);
7.2计算每个季度的总收入
1.首先,建立一个quickstart项目,写如下代码用于判断季度的规则,然后打包,再把打好的包拖入limux的/opt目录下。
2.把建好的jar包上传至hdfs里面
hdfs dfs -mkdir /func
hdfs dfs -put /opt/myfun.jar /func
3.在hive里面运行jar包
add jar 临时在数据库中加入jar包的命令
add jar /opt/myfun.jar
use shopping;
create function myquarter as "com.njbdqn.MyQuarter";
// 测试jar包
select myquarter(date) as quarter,round(sum(price),2) as salary from transaction_details group by myquarter(date);
永久建把jar包上传到hdfs 永久建函数
!hdfs dfs -put /opt/myfun.jar /func;
create function myp as "com.njbdqn.MyQuarter" using jar "hdfs:/func/myfun.jar"
use shopping;
select myp(date) from transaction_detials limit 1;
// 按季计算总收入
select myp(date) as quarter,round(sum(price),2) as salary from transaction_details group by myp(date)
// 7.3按年计算总收入
select year,round(sum(price),2) as salary from transaction_details group by year
// 7.4按周计算总收入
select concat(year,'-',weekofyear(date),'周'),round(sum(price),2) as salary from transaction_details group by concat(year,'-',weekofyear(date),'周')
// 7.5/7.6 按时间段计算收入(上午、中午等)
表里存在的数据不是标准的24小时计时法,且还有pm、am等不需要的数据
首先,把数据转换成24小时计数的标准格式,pm、am删掉,带pm的加上12个小时,参照以下的博客,可以找到
HIVE 在原始时间上加八小时的方法https://zhidao.baidu.com/question/1674477743252266627.html?qq-pf-to=pcqq.group
select from_unixtime(unix_timestamp('2017-10-31 16:00:00')+28800,'yyyy-MM-dd HH:mm:ss')
其中unix_timestamp是日期转时间戳bai,28800=8*60*60(小时换为秒)du
from_unixtime是转回日期格式,大概是这个意思
// 下午部分:后面含有PM的部分,43200=12*60*60,默认拼接1920-1-1和:00秒,然后转换成时间戳,加上12个小时之后,截取时分部分,根据时分部分方便计算时间段,然后再转换成标准的时间格式
// 上午部分:后面含有AM就截取不带AM的时间
select time,case when instr(time,'PM')!=0 then from_unixtime(unix_timestamp('1920-1-1',split(time,' ')[0],':00'))+43200,'HH:mm') when instr(time,'AM')!=0 then split(time,' ')[0] else time end from transaction_details limit 3
以下就是运行出来的结果,时间格式统一
时间转换的宏
用标准的时间格式去判断时间段
with
t as (select store_id,case when instr(time,'PM')!=</