hive视图

Hive 0.6版本及以上支持视图
Hive View具有以下特点:
1. View是逻辑存在,Hive暂不支持物化视图(1.0.3)
2. View只读,不支持LOAD/INSERT/ALTER。需要改变View定义,可以是用Alter View
3. View内可能包含ORDER BY/LIMIT语句,假如一个针对view的查询也包含这些语句, 则view中的语句优先级高。例如,定义view数据为limit 10, 针对view的查询limit 20,则最多返回10条数据。
4. Hive支持迭代视图

创建View

  1. CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ]  
  2. [COMMENT view_comment]  
  3. [TBLPROPERTIES (property_name = property_value, ...)]  
  4. AS SELECT ...  
删除view

  1. DROP VIEW [IF EXISTS] view_name  
修改view

  1. ALTER VIEW view_name SET TBLPROPERTIES table_properties  
  2.   
  3. table_properties:  
  4.   : (property_name = property_value, property_name = property_value, ...)  

实例:


  1. hive> desc student;  
    OK  
    id      int  
    name    string  
    academy string  
    class   string  
    Time taken: 0.146 seconds  
    hive> create view student_view (id, name_length) as  select id, length(name) from student;  
    OK  
    Time taken: 0.424 seconds  
    hive> desc student_view;  
    OK  
    id      int  
    name_length     int  
    Time taken: 0.071 secondshive> select * from student;  
    Total MapReduce jobs = 1  
    ......  
    Total MapReduce CPU Time Spent: 680 msec  
    1       20      computer        034  
    2       21      computer        034  
    3       19      computer        034  
    4       18      computer        034  
    5       22      computer        034  
    6       23      computer        034  
    7       25      computer        034  
    1       20      physics 034  
    2       21      physics 034  
    3       19      physics 034  
    4       18      physics 034  
    5       22      physics 034  
    6       23      physics 034  
    7       25      physics 034Time taken: 0.176 seconds  
    hive> select * from student_view;  
    Total MapReduce jobs = 1  
    ......  
    Total MapReduce CPU Time Spent: 680 msec  
    OK  
    1       2  
    2       2  
    3       2  
    4       2  
    5       2  
    6       2  
    7       2  
    1       2  
    2       2  
    3       2  
    4       2  
    5       2  
    6       2  
    7       2  


  2. Time taken: 20.592 secondshive> create view student_view_view(id)  
        > as                                 
        > select id from student_view;  
    OK  
    Time taken: 0.215 seconds  
    hive> select * from student_view_view;  
    Total MapReduce jobs = 1  
    .....  
    Total MapReduce CPU Time Spent: 790 msec  
    OK  

  3. 1  
    2  
    3  
    4  
    5  
    6  
    7  
    1  
    2  
    3  
    4  
    5  
    6  
    7  

    hive中的视图是只读的,所以无法通过视图向基表(base table)加载或插入数据。

    视图的 SELECT 语句只在执行引用视图的语句时才执行。

    对于上节用于 查询每年各个气象站气温最大值的均值 的HQL语句,可以先创建一个记录有效记录(即有特定quality值)的视图:

    CREATE VIEW valid_records AS
    SELECT * FROM records2
    WHERE temperature != 999
    AND (quality=0 OR quality=1 OR quality=4 OR quality=5 OR quality=9);

    创建视图时并不执行查询,查询只是存储在metastore中

    SHOW TABLES命令的输出结果里包括视图。使用 DESCRIBE EXTENDED view_name查看某个视图的详细信息,包括用于定义它的那个查询。 

    接下来,基于第一个视图,建立第二个视图(每个观测站每年的最高气温):

    CREATE VIEW view_max_temperatures (station, year, max_temperature) AS
    SELECT station, year, MAX (temperature) FROM valid_records
    GROUP BY station, year;

    在这个视图定义中,显示列出了列的名称。因为最高气温列是一个聚集表达式,如果我们不指明,Hive会自己创建一个别名(例如_C2)。

    我们也可以在SELECT语句中使用AS子句来为列命名( MAX(temperature) AS max_temperature)。

     

    有了这两个视图,现在我们就可以执行查询了:

    SELECT station, year, AVG(max_temperature)

    FROM view_max_temperatures

    GROUP BY station, year;

    这个查询的结果和前面使用子查询的结果是一样的。并且,Hive为他们所使用的MR作业也一样:2个,每个GROUP BY使用一个MR作业。


你可能感兴趣的:(hadoop,hive)