Hive数仓导入导出,分隔符
移除点击此处添加图片说明文字
首先看下导出吧,我们准备sql。那么首先我们看到,两张表给运营提供数据。另一方面,让我们看看hive的强大。
先看一下两张表数据量:
select count(dt) from d.d_safedata_base_day 数据量:10836008
select count(dt) from d.d_safedata_applist_day 数据量: 346756144
移除点击此处添加图片说明文字drop table testing.weiboapplist;
接着创建中间表,查询微博的应用用户使用情况。
create table testing.weiboapplist as
select
a.imei,
a.imsi,
a.uuid,
a.app_pakeage_name,
a.app_name ,
a.version_code,
a.version_name,
b.datetime,
a.dt,
b.mac,
b.mobile_brand,
b.product_code,
b.model
from
(
select
imei,imsi,uuid,app_pakeage_name,app_name,version_code,version_name,dt,timestamp
from d.d_safedata_applist_day where dt between '20170601' and '20170630' and uuid <> '' and uuid is not null and app_name='微博'
group by imei,imsi,uuid,app_pakeage_name,app_name,version_code,version_name,dt,timestamp
) a
left join
(
select
uuid,imei,mac,mobile_brand,board,product_code,model,datetime
from d.d_safedata_base_day where dt between '20170601' and '20170630'
group by imei,mac,mobile_brand,board,product_code,model,uuid,datetime
) b
on a.uuid =b.uuid;
这样之后,数据量大约但是,
select count(dt) from weiboapplist 数据量: 169345
此时会有很多因为时间戳不一样的重复数据,所以,我们返回记录不需要时间戳,那么,重新清洗。
中间表创建之后,我们不要时间戳,再次去重,并且放弃时间戳。
create table testing.result as
SELECT imei,
imsi,
uuid,
app_pakeage_name,
app_name,
version_code,
version_name,
dt,
mac,
mobile_brand,
product_code,
model
FROM
weiboapplist
GROUP BY
imei,
imsi,
uuid,
app_pakeage_name,
app_name,
version_code,
version_name,
dt,
mac,
mobile_brand,
product_code,
model
这样数据量就会再次变小
select count(dt) from result 数据量: 59351
然后咱们要用hive导出了。
此时我们切换hive用户,来到/home/hive/目录下面
导出:
hive -e "select * from testing.result;" | tr '\t' ',' >result.log
可以看到有五万九千多条。
咱们
less result.log
然后esc q enter出来
wc -l result.log
看看有多少行
在pwd看看文件在哪里
移除点击此处添加图片说明文字看下文件。
移除点击此处添加图片说明文字然后我们把文件拿出来。
移除点击此处添加图片说明文字随手改成txt呗。
移除点击此处添加图片说明文字然后这个是唯品会的需求,和微博一样,那我们打开txt看看呗。
移除点击此处添加图片说明文字然后创建一个空excel。
移除点击此处添加图片说明文字选择数据->导入数据
移除点击此处添加图片说明文字选择
移除点击此处添加图片说明文字然后打开txt
移除点击此处添加图片说明文字注意编码:
移除点击此处添加图片说明文字注意分隔符,因为我们hive -e 命令是用逗号的,这里也要用逗号。
移除点击此处添加图片说明文字选这个
移除点击此处添加图片说明文字然后直接完成、下一步都可以。
会卡住一会儿。
帅气吗?25万。
移除点击此处添加图片说明文字这么做有小bug。
移除点击此处添加图片说明文字我们让首行进一格,然后,记住加好字段名称就可以了。
此外,去问了一下需求,原来,这么做就是想知道,从我们平台走的用户唯品会和新浪微博有多少真实的用户。其中呢,如果有手机详细信息最好,并且访问时间最好是最近的一次(这么做是叫有理可依据)
所以,我们的hive还得优化。
补充:
微博的选一个最近的用户uuid放进去
create table testing.result3 as
select
imei ,imsi ,uuid ,app_pakeage_name,app_name ,version_code ,version_name ,dt , mac , mobile_brand , product_code , model
from
(
select imei ,imsi ,uuid ,app_pakeage_name,app_name ,version_code ,version_name ,dt , mac , mobile_brand , product_code , model,ROW_NUMBER() OVER(PARTITION BY uuid ORDER BY dt DESC) as num
from result1
) t
where t.num = 1
查一下数据量: 19773条
select count(*) from (select * from result3 ) c
唯品会选一个最近的用户uuid放进去
create table testing.result4 as
select
imei ,imsi ,uuid ,app_pakeage_name,app_name ,version_code ,version_name ,dt , mac , mobile_brand , product_code , model
from
(
select imei ,imsi ,uuid ,app_pakeage_name,app_name ,version_code ,version_name ,dt , mac , mobile_brand , product_code , model,ROW_NUMBER() OVER(PARTITION BY uuid ORDER BY dt DESC) as num
from result2
) t
where t.num = 1
查一下数据量: 80685条
select count(*) from (select * from result4 ) c
有关于导入,我记得在之前mapreduce处理已经有过截图了。这里不再赘述。
比方说,hive表创立好了,然后分区也已经建立,从hdfs中导入
hadoop fs -cp /user/hive/warehouse/testing.db/output/base-r-* /user/hive/warehouse/d.db/d_safedata_base_day/dt=20170626