
教材第六章 Hive 数据库对象与用户自定义函数 实验
一 Hive 视图
1创建视图
hive> create view sogou_view as select * from sogou_table_ext where keyword is not null limit 100;
OK
说明:创建一个视图sogou_view,其数据源自数据表sogou_table_ext的前100行数据
hive> desc sogou_view;
OK
ts string
uid string
keyword string
rank int
seq int
url string
year int
month int
day int
hour int;
说明:视图的列属性和源自的数据表没有任何区别
hive> select * from sogou_view;
说明:查询视图中的数据,需要执行一个MapReduce任务,原因是创建视图时的select *语句不会立即执行,而是在执行视图查询时才会执行,视图只是一个逻辑概念,有查询语句需要对视图进行查询时,才会真正执行select语句获取数据
2 视图应用
hive> create view sogou_rank_view as select * from sogou_table_ext_parttition where rank <=3;
OK
hive> desc sogou_view;
OK
ts string
uid string
keyword string
rank int
seq int
url string
year int
month int
day int
hour int
说明:创建视图sogou_rank_view,其数据源自对表sogou_table_ext_parttition的查询结果,即用户点击排名前3位的搜索记录
hive> select uid, count(*) as cnt from sogou_rank_view group by uid having cnt > 2;
Time taken: 183.985 seconds, Fetched: 419751 row(s)
说明:在用户点击排名前3位的搜索记录视图中,统计用户搜索次数大于2次的搜索记录
二 Hive 分桶表
hive > create table sogou_bucket (uid string, keyword string) clustered by(uid) into 5 buckets row format delimited fields terminated by 't';
hive> desc sogou_bucket;
uid string
keyword string
说明:创建一个分桶表sogou_bucket,clustered by(uid)是按照uid列进行分桶,共分成5个桶,也就是HDFS上的数据文件按uid拆分成5个数据文件
hive> set hive.enforce.bucketing;
hive.enforce.bucketing=false
hive> set hive.enforce.bucketing = true;
hive> set hive.enforce.bucketing;
hive.enforce.bucketing=true
说明:开启允许强制分桶;如果开启强制分桶,在insert写入数据时会进行自动分桶,即将HDFS的数据文件自动拆分成多个数据文件
hive> insert overwrite table sogou_bucket select uid, keyword from sogou_table_ext_parttition limit 10000;
OK
Time taken: 140.302 seconds
说明:将sogou_table_ext_parttition表的前1万行数据写入分桶表sogou_bucket中,在写入过程中会自动分桶
在Linux终端执行命令 hadoop fs -ls -R /user/hive/warehouse/sogou_bucket
-rwxr-xr-x 1 root supergroup 104392 2021-09-29 11:00 /user/hive/warehouse/sogou_bucket/000000_0 -rwxr-xr-x 1 root supergroup 105640 2021-09-29 11:00 /user/hive/warehouse/sogou_bucket/000001_0 -rwxr-xr-x 1 root supergroup 112674 2021-09-29 11:00 /user/hive/warehouse/sogou_bucket/000002_0 -rwxr-xr-x 1 root supergroup 103307 2021-09-29 11:00 /user/hive/warehouse/sogou_bucket/000003_0 -rwxr-xr-x 1 root supergroup 107669 2021-09-29 11:00 /user/hive/warehouse/sogou_bucket/000004_0
说明:分桶表sogou_bucket被按照uid自动分成了5个桶,即在写入数据时执行MapReduce作业,按照uid自动分成了5个数据文件