目录

一、Hive Lateral View

1、基本介绍

2、Hive表行转列,列转行以及Hive Lateral View在列转行中的使用

二、Hive视图

1、Hive视图基本介绍

2、Hive视图特点

3、Hive视图的意义

4、Hive视图的创建和删除

5、视图的使用

6、查询所有的hive视图

三、Hive索引

1、Hive索引的实现原理

2、创建索引

3、使用索引

4、删除索引


一、Hive Lateral View

1、基本介绍

Lateral View用于和UDTF函数(explode、split)结合来使用。 ​ 首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。主要解决在select使用UDTF做查询过程中,查询只能包含单个UDTF,不能包含其他字段、以及多个UDTF的问题。 ​

语法: ​

LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)

2、Hive表行转列,列转行以及Hive Lateral View在列转行中的使用

  • 表1:cityInfo

cityname

regionname

上海

四川北路

上海

虹梅路

上海

音乐学院

上海

徐家汇

上海

陆家嘴

上海

古北

北京

东四

北京

复兴门

北京

新街口

北京

地安门

  • 表2:cityInfoSet

cityname

regionname

上海

四川北路,虹梅路,音乐学院,徐家汇,陆家嘴,古北

北京

地安门,复兴门,东四,新街口

表1和表2的结构如上所示。

现在需要在 hive 中使用 Hql 语句对表1和表2进行互相转化。

(1)行转列

使用的函数说明:

concat_ws(string SEP,string array<String>):函数返回字符串连接后的结果,SEP表示各个字符串连接的分割符;collect_set(col): 函数将col字段进行去重,并合并成一个数组。

表1=>表2 可以使用 hive 的内置函数 concat_ws() 和 collect_set()进行转换,执行hql如下所示:

select cityname,concat_ws(',',collect_set(regionname)) as address_set from cityInfo group by cityname;

(2)列转行

使用到的函数

函数split(String str,String pat) 将字符串按照pat分割;函数explode(array) 将数组中的元素拆分为多行显示。

表2=>表1 可以使用 hive 的内置函数 lateral view explode()进行转化。执行hql如下:

select cityname, regionname from cityInfoSet lateral view explode(split(address_set, ',')) aa as region;

二、Hive视图

1、Hive视图基本介绍

视图是一个虚拟表,其内容由查询定义。Hive 中的视图和RDBMS中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条SELECT语句的结果集。视图是纯粹的逻辑对象,没有关联的存储(Hive 3.0.0引入的物化视图除外),当查询引用视图时,Hive可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。

2、Hive视图特点

(1)不支持物化视图 ​;

(2)只能查询,不能做加载数据操作 ​ ;

(3)视图的创建,只是保存一份元数据,查询视图时才执行对应的子查询 ​;

(4)view定义中若包含了ORDER BY/LIMIT语句,当查询视图时也进行了ORDER BY/LIMIT语句操作,view当中定义的优先级更高 ​ ;

(5)Hive视图支持迭代视图。

3、Hive视图的意义

(1) 使用视图使数据操作更简便,相当于封装了sql语句,类似于关系型数据库中的存储过程。

(2) 使用视图,基表中的数据有了一定的安全性,使用视图可以基于限制条件过滤数据,通过视图限制数据访问可以保护信息不被随意查询。

4、Hive视图的创建和删除

--创建视图:CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)]AS SELECT ... ;
--查询视图:select colums from view;
--删除视图:DROP VIEW [IF EXISTS] [db_name.]view_name;

案例:

CREATE VIEW gal_view IF NOT EXISTS AS SELECT * FROM product1 p LEFT JOIN logistic l ON p.sku=l.lsku; 

5、视图的使用

SELECT sku,price FROM gal_view;

6、查询所有的hive视图

(1) show tables可以查看到新增的视图

查看结构 :

(2) Hive的元数据信息一般存储在mysql,Hive的视图信息存储在mysql hive数据库中的 TBLS 表中,通过如下查询语句可以查询得到Hive中的所有视图:

SELECT * FROM TBLS WHERE TBL_TYPE='VIRTUAL_VIEW';

结果:

三、Hive索引

hive的索引可以提高数据的检索效率,避免全表扫描和资源浪费,对于含有group by的语句,对group by的字段添加索引可以提高查询速度。

1、Hive索引的实现原理

在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量。

在执行索引字段查询时候,首先额外生成一个MR job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs文件路径及偏移量,输出到hdfs上的一个文件中,然后根据这些文件中的hdfs路径和偏移量,筛选原始input文件,生成新的split,作为整个job的split,这样就达到不用全表扫描的目的。

2、创建索引

创建索引的字段最好使用不更新的字段,以免频繁重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。

现在有一张表名为product1的表,需要将该表中的sku字段建立一个索引,案例:

create index test_index on table product1(sku)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
in table product1_index;create index test_index2 on table product1(sku) as 'bitmap' with deferred rebuild in table product1_index2;

两种创建方式 as 后表示两种不同的索引处理器。

创建示例如下(这里采用的bitmap索引处理器):

0: jdbc:hive2://cdh-001:10000/test> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
| gal_view  |
| logistic  |
| product1  |
| stocks    |
+-----------+--+
4 rows selected (0.027 seconds)//创建索引
0: jdbc:hive2://cdh-001:10000/test> create index test_index2 on table product1(sku) as 'bitmap' with deferred rebuild in table product1_index2;0: jdbc:hive2://cdh-001:10000/test> show tables;
+------------------+--+
|     tab_name     |
+------------------+--+
| gal_view         | //这是之前创建的视图
| logistic         |
| product1         |
| product1_index2  | //可以看到这里多了一张索引表
| stocks           |
+------------------+--+
5 rows selected (0.033 seconds)//重建索引生成索引数据(建立索引之后必须重建索引才能生效)
0: jdbc:hive2://cdh-001:10000/test> alter index test_index2 on product1 rebuild;//创建完成后通过索引命令显示索引
0: jdbc:hive2://cdh-001:10000/test> SHOW FORMATTED INDEX ON product1;
+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+--+
|       idx_name        |       tab_name        |       col_names       |     idx_tab_name      |       idx_type        |        comment        |
+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+--+
| idx_name              | tab_name              | col_names             | idx_tab_name          | idx_type              | comment               |
|                       | NULL                  | NULL                  | NULL                  | NULL                  | NULL                  |
|                       | NULL                  | NULL                  | NULL                  | NULL                  | NULL                  |
| test_index2           | product1              | sku                   | product1_index2       | bitmap                |                       |
+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+--+

3、使用索引

hive默认不使用索引,需要设置才能使索引生效:

SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
SET hive.optimize.index.filter=true;
SET hive.optimize.index.filter.compact.minsize=0;//执行查询
select * from product1 where sku=272480720;

4、删除索引

DROP INDEX IF EXISTS product1_index2 ON product1;

Hive的视图和索引相关推荐

  1. mysql hive索引_Hive数据仓库--HiveQL视图和索引

    上篇文章中讲完了查询的相关操作,接下来就是视图与索引了,Hive中的视图的作用总的来说就是为了简化查询语句,是一个逻辑上的视图,而不是物化的视图.索引则是加快查询速度的比较重要的手段,之前的Mysql ...

  2. 2020.9.28(Hive视图、索引、权限管理)

    回顾:上节课讲了hive的参数设置,hive的运行方式,hive的动态分区,分桶,lateral view这五个知识点.遗留了两个问题: 1.看一下hive的源码,现在面试中,hive的源码还从来没有 ...

  3. ElasticSearch-Hadoop:从Hadoop到ElasticSearch的产品视图计数索引和客户顶部搜索查询...

    这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引. 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查 ...

  4. Oracle数据库之对象视图、索引、序列、同义词

    Oracle数据库总结: Oracle数据库之集合运算 Oracle数据库之数据处理 Oracle数据库之建表和管理表 Oracle数据库之对象视图.索引.序列.同义词 视图: 语法: create ...

  5. oracle视图和索引,oracle视图和索引

    视图和索引 视图 视图的作用 控制数据访问.简化查询.避免重复访问相同的数据 视图的优点 限制用户只能通过视图检索数据,用户看不到底层基表 注意事项 视图可以理解为临时表,会随着真实表的数据变化而自动 ...

  6. Oracle→序列、视图、索引、存储过程、存储函数、包、触发器、表分区、锁表解锁表、事务、PLSQL、备份恢复、游标

    序列SEQUENCE 视图VIEW 索引 同义词 存储过程 存储函数 包 JAVA调用包 触发器 表分区 锁表解锁表 事务 PLSQL 备份恢复

  7. mysql 索引的模糊查询_MYSQL语法(模糊查询,视图,索引)

    MYSQL语法(模糊查询,视图,索引) 2020年08月11日 | 萬仟网IT编程 | 我要评论 MYSQL模糊查询模糊查询,查询name 以张开头的数据select *from t1 where n ...

  8. oracle图书操作、sql语句查询+授权、视图、索引、表操作

    oracle图书操作.sql语句查询+授权.视图.索引.表操作 一.创建一张表book,表结构为(总编号,分类号,书名,作者,出版单位,单价),插入若干记录 二.创建一张表reader,表结构为(借书 ...

  9. oracle 视图、索引、序列、同义词

    目录 1.视图对象 1.1创建视图 1)简单视图 2)建立只读视图 3)复杂视图 1.2管理视图 1)查看视图定义 2)修改视图定义 3)重新编译视图 4)删除视图 2.索引 2.1索引概述 2.2创 ...

最新文章

  1. Linux内核spin_lock与spin_lock_irq分析
  2. Nginx模块学习之————accesskey权限模块使用(简单的m3u8防盗链)
  3. java 反射 速度_Java反射,但速度更快
  4. 基于MaxCompute分布式Python能力的大规模数据科学分析
  5. mysql中limit后面不能使用运算符
  6. C ++ 数组 | 寻找最大、最小值,数组(Array)_1
  7. Android:eclipse新建android工程style文件里的Theme老是报错
  8. 内网渗透 - 权限维持 - Linux
  9. ppt计算机实验报告册,PPT实验报告册
  10. DatePickerDialog的确定和取消按钮
  11. 1、mysql创建事件
  12. debian adsl上网
  13. ☀️光天化日学C语言☀️(09)- 算术运算符 | 小学就会了?温故而知新,可以为师矣!
  14. 深入了解Redis内存模型
  15. cmake(13):构建时设置预处理宏定义以及add_compile_definitions命令详解
  16. python hypothesis testing
  17. 微芯片植入大脑可保存人们的大脑记忆内容
  18. python打开桌面文件_python整理桌面文件
  19. java 实现繁简字体转换(笨方法)
  20. 官方发布!2021下半年二建考试报名注意事项!

热门文章

  1. CentOS7-命令-关闭selinux
  2. android发送短信指定收件人,Android:如何从原始短信获取发件人和收件人电话号码...
  3. uniapp修改头像
  4. 阿里云AliYun物联网平台使用-申请免费试用及完成初始配置
  5. 抽象之美——万物皆可设计
  6. 【图像检测】基于形态学实现图像目标尺寸测量系统附matlab代码
  7. ubuntu美化记,-修改皮肤,安装工具。
  8. Redis学习之rename命令
  9. 从FFmpeg源码去解决IJKPlayer直播花屏问题
  10. JavaScript循环结构