Hive视图和索引以及MySQL,Hive,Hbase视图概念相关理解
一、HiveQL视图和索引
(1)、视图:
Hive中的视图的作用总的来说就是为了简化查询语句,是一个逻辑上的视图,而不是物化的视图。索引则是加快查询速度的比较重要的手段,之前的Mysql优化的文章中也讲到了索引的使用,感觉概念上和Mysql数据库中的操作基本上是相似的。
1)、创建视图语句
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ...
2)、创建视图
create view salaries_high as select * from salaries_external where salary > 500000;
3)、删除视图
hive> drop view if exists salaries_high;
OK
Time taken: 1.043 seconds
(2)、索引:
1)、创建索引语句
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"]
2)、创建一个索引
hive> desc formatted parquet;
OK
# col_name data_type comment
member_id string
name string
stat_date string
province string
add_item string add new item comment
# Detailed Table Information
Database: yyz_workdb
Owner: a6
CreateTime: Tue Nov 07 10:59:49 CST 2017
LastAccessTime: UNKNOWN
Retention: 0
Location: hdfs://localhost:9002/user/hive/warehouse/yyz_workdb.db/parquet
Table Type: MANAGED_TABLE
Table Parameters:
COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\"}
last_modified_by a6
last_modified_time 1526612655
numFiles 1
numRows 5
rawDataSize 20
totalSize 792
transient_lastDdlTime 1526612655
# Storage Information
SerDe Library: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
InputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim \t
serialization.format \t
Time taken: 0.077 seconds, Fetched: 37 row(s)
hive> CREATE INDEX stat_date_index ON TABLE parquet(stat_date) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Please specify deferred rebuild using " WITH DEFERRED REBUILD ".
hive> CREATE INDEX stat_date_index ON TABLE parquet(stat_date) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH DEFERRED REBUILD;
OK
Time taken: 0.432 seconds
3)、查看索引
hive> show index on parquet;
OK
stat_date_index parquet stat_date yyz_workdb__parquet_stat_date_index__ compact
Time taken: 0.12 seconds, Fetched: 1 row(s)
4)、改变索引
hive> alter index stat_date_index on parquet rebuild;
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Query ID = a6_20180518145635_befdcebc-d6a4-4514-b9b1-8e0887d88453
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1526434993990_0003, Tracking URL = http://localhost:8088/proxy/application_1526434993990_0003/
Kill Command = /Users/a6/Applications/hadoop-2.6.5/bin/hadoop job -kill job_1526434993990_0003
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2018-05-18 14:56:55,370 Stage-1 map = 0%, reduce = 0%
2018-05-18 14:57:04,156 Stage-1 map = 100%, reduce = 0%
2018-05-18 14:57:11,732 Stage-1 map = 100%, reduce = 100%
Ended Job = job_1526434993990_0003
Loading data to table yyz_workdb.yyz_workdb__parquet_stat_date_index__
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 HDFS Read: 11065 HDFS Write: 285 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: 39.497 seconds
5)、删除索引
hive> show index on parquet;
OK
stat_date_index parquet stat_date yyz_workdb__parquet_stat_date_index__ compact
Time taken: 0.076 seconds, Fetched: 1 row(s)
hive> drop index stat_date_index on parquet;
OK
Time taken: 1.562 seconds
hive> show index on parquet;
OK
Time taken: 0.056 seconds
二、MySQL,Hive,Hbase视图概念相关理解
(1)、从MySQL里的视图概念理解入手
1)、视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表。在数据库中,存放的只是视图的定义,而不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。视图可以被定义为多个表的连接,也可以被定义为只有部分列可见,也可为部分行可见。
2)、视图的作用有:
首先,可以简化数据查询语句
其次,可以使用用户能从多角度看待同一数据
然后,通过引入视图可以提高数据的安全性
最后,视图提提供了一定程度的逻辑独立性等。
3)、引入视图机制带来的好处:
通过引入视图机制,用户可以将注意力集中在其关心的数据上(而非全部数据),这样就大大提高了用户效率与用户满意度,而且如果这些数据来源于多个基本表结构,或者数据不仅来自于基本表结构,还有一部分数据来源于其他视图,并且搜索条件又比较复杂时,需要编写的查询语句就会比较烦琐,此时定义视图就可以使数据的查询语句变得简单可行。
定义视图可以将表与表之间的复杂的操作连接和搜索条件对用户不可见,用户只需要简单地对一个视图进行查询即可,故增加了数据的安全性,但不能提高查询效率。
(2)、Hive视图
Hive视图是一种无关底层存储的逻辑对象。视图中的数据是SELECT查询返回的结果。在视图选定后才会开始执行SELECT查询。
需要注意的是,视图是只读的,不能向视图中插入或是加载数据。
视图通常被用作将数据发布给外部客户端的抽象层。视图可以使用稳定的公开的列名和数据类型来创建。
视图可以允许在不影响下游数据消费者的情况下修改内部的表结构。
一定要理解,创建视图,是基于表来创建得到视图的。
(3)、HBase的概念视图和物理视图
虽然,从HBase的概念视图来看,每个表格是由很多行组成的,但是在物理存储上面,它是按照列来保存的,这一点在进行数据设计和程序开发的时候必须牢记。
在物理存储上面,它是按照列来保存的
需要注意的是,在概念视图上面有些列是空白的,这样的列实际上并不会被存储,当请求这些空白的单元格时,会返回null值。
如果在查询的时候不提供时间戳,那么会返回距离现在最近的那一个版本的数据。因为在存储的时候,数据会按照时间戳来排序。