Hive视图

目录

Hive动态分区中的视图和map类型

相关知识

[Hive 分区Hive 中的表分区比较简单,就是将同一组数据放到同一个 HDFS 目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为 Input,从而减少 MapReduce 的输入数据,提高查询效率。](#Hive 分区Hive 中的表分区比较简单,就是将同一组数据放到同一个 HDFS 目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为 Input,从而减少 MapReduce 的输入数据,提高查询效率。)

[动态分区启用 Hive 动态分区,只需要在 Hive 会话中设置两个参数:](#动态分区启用 Hive 动态分区,只需要在 Hive 会话中设置两个参数:)

[map类型Hive 之所以能在大数据领域比较受欢迎,很大一部分原因在于相比其他SQL类存储系统支持更加复杂的数据类型,map 就是其中一种。](#map类型Hive 之所以能在大数据领域比较受欢迎,很大一部分原因在于相比其他SQL类存储系统支持更加复杂的数据类型,map 就是其中一种。)

Hive使用视图降低查询复杂度

[编程要求平台中有一个表 employee, 建表的语法如下:](#编程要求平台中有一个表 employee, 建表的语法如下:)

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 会话中设置两个参数:

  1. set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.partition.mode=nonstrict;

map类型

Hive 之所以能在大数据领域比较受欢迎,很大一部分原因在于相比其他SQL类存储系统支持更加复杂的数据类型,map 就是其中一种。

案例:

  1. map结构的表结构创建

  2. hive> create table employee(id string, perf map<string, int>)
  3. > ROW FORMAT DELIMITED
  4. > FIELDS TERMINATED BY '\t'
  5. > COLLECTION ITEMS TERMINATED BY ','
  6. > MAP KEYS TERMINATED BY ':';
  7. 原始数据格式

  8. 1 job:80,team:60,person:70
  9. 2 job:60,team:80
  10. 3 job:90,team:70,person:100
  11. 数据导入

  12. hive> LOAD DATA LOCAL INPATH '/home/work/data/test7.txt' INTO TABLE employee;
  13. 数据查询

  14. hive> select perf['person'] from employee;
  15. 70
  16. NULL
  17. 使用explode()函数查询

  18. hive> select explode(perf) as (p_name,p_score) from employee limit 4;
  19. job 80
  20. team 60
  21. person 70
  22. 使用explode()和lateral view结合查询

  23. hive> select id,p_name,p_score from employee lateral view explode(perf) perf as p_name,p_score limit 3;
  24. 1 job 80
  25. 1 team 60
  26. 1 person 70
  27. 使用size()函数查看map结构中的键值对个数[也可查看array中的元素个数]

  28. hive> select size(perf) from employee
  29. 3
  30. 2
  31. 3

编程要求

根据提示,在右侧编辑器补充代码。

平台中创建了一个带有 map 类型字段的表,创建语法如下:

  1. create table person(id int, name string, family map<string, string>)
  2. > ROW FORMAT DELIMITED
  3. > FIELDS TERMINATED BY ' '
  4. > COLLECTION ITEMS TERMINATED BY ','
  5. > MAP KEYS TERMINATED BY ':';

导入的数据格式为:

  1. 1 Mary ma:Maria,fa:Bob,da:Lily,son:John
  2. 2 Bob ma:Kristin,fa:Leon,da:Mary
  3. 3 John ma:Maria,fa:Bob,son:David

请你建立一个视图 children_of_Maria,存放所有母亲叫做 Maria 的人的信息。

复制代码
create view children_of_Maria
as
select id, name, family
from person
where family['ma'] = 'Maria';

Hive使用视图降低查询复杂度

编程要求

平台中有一个表 employee, 建表的语法如下:

  1. CREATE TABLE IF NOT EXISTS employee(
  2. Id int,
  3. Name string,
  4. Salary int,
  5. Designation string,
  6. Dept string
  7. )
  8. row format delimited
  9. fields terminated by','
  10. lines terminated by'\n'
  11. stored as textfile;

导入的数据如下:

  1. 1201,Mary,45000,Technical manager,TP
  2. 1201,Bob,45000,Proofreader,PR
  3. 1203,Kristin,40000,Technical writer,TP
  4. 1204,Krian,40000,Hr Admin,HR
  5. 1205,Krathi,30000,Op Admin,Admin
  6. 1206,John,45000,Technical manager,TP
  7. 1207,Jake,50000,Proofreader,PR
  8. 1208,Adela,60000,Technical writer,TP
  9. 1209,Betty,55000,Hr Admin,HR
  10. 1210,Sam,40000,Op Admin,Admin

你需要在右边的代码框中编写 Hive SQL 语句。实现选出所有 Salary 超过 50000 的人的信息存为视图 rich ,然后展示视图的信息。

复制代码
CREATE VIEW IF NOT EXISTS rich AS
SELECT *
FROM employee
WHERE Salary > 50000;
相关推荐
yumgpkpm3 小时前
数据可视化AI、BI工具,开源适配 Cloudera CMP 7.3(或类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版)值得推荐?
人工智能·hive·hadoop·信息可视化·kafka·开源·hbase
二进制_博客5 小时前
使用datax将mysql数据抽取到hive分区表无数据
数据库·hive·mysql
Linux Huang7 小时前
【Dinky】IDEA运行出现HistoryServer异常
java·hadoop·flink·intellij idea
A尘埃8 小时前
Hive基于Hadoop的数据仓库工具
数据仓库·hive·hadoop
Macbethad21 小时前
使用WPF编写一个多维度伺服系统的程序
大数据·hadoop·wpf
百***35941 天前
从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
hive·servlet·tomcat
howard20051 天前
5.2 Hive插入数据实战
hive·插入数据
杂家1 天前
Hive on Spark && Spark on Hive配置
大数据·数据仓库·hive·hadoop·spark
沧海寄馀生2 天前
Apache Hadoop生态组件部署分享-Hadoop
大数据·hadoop·分布式·apache