在学习Hive中的一个关于Hive的应用场景
场景:
公司有两张业务表:1. 用户基本信息表; 2. 用户手机信息表
用户基本信息表有以下字段:user_id,gender,birthdate, create_time, address。每个用户一条记录
用户手机信息表字段:user_id, mobile, carrier, belong_to。每个用户可能有多条记录。部分手机号是错的,比如只有10位、非正常数字开头的。有部分手机超过11位,但是是正确的,因为开头加了中国区号(86或+86)。
注:carrier运营商,belong_to所属地,birthdate格式有两种:yyyy-MM-dd, yyyyMMdd,create_time格式:yyyy-MM-dd HH:mm:ss
操作:
a. 根据场景建相应的表,造测试数据插入
b. 查询
c. 从本地导数据到hive
d. 从hdfs到数据到hive
e. 联表查询,如按性别统计手机数、统计每个人拥有的手机数等等
f. 从hive取数保存到本地
g. 从hive取数保存到hdfs
h. 删除某一用户的数据
i. 合并两张表到一张新表
实现:
创建数据库v_test
create databse if not exists v_test;
创建数据表单user_info和user_phone_info
create table if not exists user_info(
user_id int,
gender int,
birthdate string,
create_time string,
address string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
stored as textfile;
create table if not exists user_phone_info(
user_id int,
mobile string,
carrier string,
belong_to string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
stored as textfile;
插入数据操作
insert into table user_info values (10,1,’2016-07-07’,’2016-07-07’,’民生银行隔壁’);
insert into table user_phone_info values(10,’156448464’,’铁通’,’铁路局’);
本地导数据,先使用pscp,传输到/home/zeus/victor/下
从本地数据导入hive
load data local inpath ‘/home/zeus/victor/userPhone.txt’ into table user_phone_info;
load data local inpath ‘/home/zeus/victor/userInfo.txt’ into table user_info;
从hadoop 导入数据到hive
注意导入文件的格式,如果错误会出现null数据
hadoop fs -put /home/zeus/victor/userPhone.txt victor
load data inpath ‘victor/userPhone.txt’ into table user_phone_info;
联表查询
select count(phone.mobile) from user_info info join user_phone_info phone on(info.user_id=phone.user_id) group by info.gender;
select count(phone.mobile) from user_info info join user_phone_info phone on(info.user_id=phone.user_id) group by info.user_id;
保存到本地
insert overwrite local directory ‘/home/zeus/victor/’ select * from user_info;
保存到HDFS
insert overwrite local directory ‘victor/’ select * from user_phone_info;
擦除数据,擦除id为0的用户
insert overwrite table user_info select * from user_info where user_id!=0;
合成新表
create table if not exists user_unio(
user_id int,
gender int,
birthdate string,
create_time string,
address string,
mobile string,
carrier string,
belong_to string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
stored as textfile;
insert into table user_unio select info.user_id,gender,birthdate,create_time,address,mobile,carrier,belong_to from user_info info full outer join user_phone_info phone on (info.user_id=phone.user_id);
导入数据:
userInfo.txt:
1 1 2016-07-01 2016-07-01 民生
2 2 2016-07-02 2016-07-02 银行隔壁
3 3 2016-07-03 2016-07-03 民生银行隔壁
4 1 2016-07-04 2016-07-04 民生隔壁
5 1 2016-07-05 2016-07-05 隔壁
userPhone.txt
1 15626470246 联通 乌鲁木齐
2 186666667666 移动 广州
3 8615626470246 联通 广州
4 +8615626470246 联通 广州
5 18819472411 移动 北京
5 18819472412 移动 北京
5 18819472413 移动 北京
5 18819472414 移动 北京
5 18819472415 移动 北京
另外:千万注意格式