Hive 视图创建:基于 Map 数据类型筛选母亲为 Maria 的人
Hive 视图创建:筛选母亲为 Maria 的人
本关任务:按照要求生成一个带有 map 数据类型的表的视图。
相关知识
为了完成本关任务,你需要掌握:
- Hive 动态分区
- map 数据类型
Hive 分区
Hive 中的表分区比较简单,就是将同一组数据放到同一个 HDFS 目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为 Input,从而减少 MapReduce 的输入数据,提高查询效率。
创建一个分区的案例如下:
CREATE EXTERNAL TABLE t_lxw1234 (
id INT,
ip STRING COMMENT '访问者IP',
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT 'lxw的大数据田地-lxw1234.com'
PARTITIONED BY (month STRING, day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS textfile;
在创建表时候,使用 PARTITIONED BY 关键字来指定该表为分区表,后面括号中指定了分区的字段和类型,分区字段可以有多个,在 HDFS 中对应多级目录。
比如,上面的表 t_lxw1234 分区 month='2015-06',day='2015-06-15'对应 HDFS 上的路径为:/user/hive/warehouse/default.db/t_lxw1234/month=2015-06/day=2015-06-15/,当查询中指定了 month='2015-06' AND day='2015-06-15',MapReduce 直接从该目录中读取数据,如果只指定了 month='2015-06',那么 MapReduce 将 /month=2015-06/ 下所有的子目录都作为 Input。
对以上案例进行分区操作入下:
-
分区追加数据:INSERT INTO TABLE t_lxw1234 PARTITION (month = '2015-06',day = '2015-06-15') SELECT * FROM dual;
-
使用INSERT添加分区:ALTER TABLE t_lxw1234 ADD PARTITION (month = '2015-06',day = '2015-06-15') location 'hdfs://namenode/tmp/lxw1234/month=2015-06/day=2015-06-15/';
-
查看表的所有分区:show partitions t_lxw1234;
-
删除分区:ALTER TABLE t_lxw1234 DROP PARTITION (month = '2015-01', day = '2015-01-25');
动态分区
启用 Hive 动态分区,只需要在 Hive 会话中设置两个参数:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
map类型
Hive 之所以能在大数据领域比较受欢迎,很大一部分原因在于相比其他SQL类存储系统支持更加复杂的数据类型,map 就是其中一种。
案例:
# map结构的表结构创建
hive> create table employee(id string, perf map<string, int>)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '\t'
> COLLECTION ITEMS TERMINATED BY ','
> MAP KEYS TERMINATED BY ':';
# 原始数据格式
1 job:80,team:60,person:70
2 job:60,team:80
3 job:90,team:70,person:100
# 数据导入
hive> LOAD DATA LOCAL INPATH '/home/work/data/test7.txt' INTO TABLE employee;
# 数据查询
hive> select perf['person'] from employee;
70
NULL
# 使用explode()函数查询
hive> select explode(perf) as (p_name,p_score) from employee limit 4;
job 80
team 60
person 70
# 使用explode()和lateral view结合查询
hive> select id,p_name,p_score from employee lateral view explode(perf) perf as p_name,p_score limit 3;
1 job 80
1 team 60
1 person 70
# 使用size()函数查看map结构中的键值对个数[也可查看array中的元素个数]
hive> select size(perf) from employee
3
2
3
编程要求
根据提示,在右侧编辑器补充代码。
平台中创建了一个带有 map 类型字段的表,创建语法如下:
create table person(id int, name string, family map<string, string>)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ' '
> COLLECTION ITEMS TERMINATED BY ','
> MAP KEYS TERMINATED BY ':';
导入的数据格式为:
1 Mary ma:Maria,fa:Bob,da:Lily,son:John
2 Bob ma:Kristin,fa:Leon,da:Mary
3 John ma:Maria,fa:Bob,son:David
请你建立一个视图 children_of_Maria,存放所有母亲叫做 Maria 的人的信息。
-- 设置动态分区模式
set hive.exec.dynamic.partition.mode=nonstrict;
-- 创建视图
CREATE VIEW children_of_Maria AS
SELECT id, name, family['ma'] AS mother, family['fa'] AS father, family['da'] AS daughter, family['son'] AS son
FROM person
WHERE family['ma'] = 'Maria';
原文地址: https://www.cveoy.top/t/topic/nywt 著作权归作者所有。请勿转载和采集!