Hive表

一、Hive運行模式

       1.Hive的運行模式即任務的執行環境

       2.分爲本地與集羣兩種,我們可以通過mapred.job.tracker 來指明
         設置方式:hive > SET mapred.job.tracker=local

二、Hive的啓動方式

       1.hive 命令行模式,直接輸入#/hive/bin/hive的執行程序,或者輸入 #hive --service cli 

       2. hive web界面的 (端口號9999), 啓動方式 #hive --service hwi 或者用於通過瀏覽器來訪問hive,http://hadoop0:9999/hwi/

三、Hive與傳統數據庫

      

四、Hive的數據類型

        1.基本數據類型

         tinyint/smallint/int/bigint
         float/double
         boolean
         string

        2.複雜數據類型

         Array/Map/Struct
       【注:沒有date/datetime】

五、Hive的數據存儲

        1. Hive的數據存儲基於Hadoop HDFS
        2.Hive沒有專門的數據存儲格式
        3.存儲結構主要包括:數據庫、文件、表、視圖
        4.Hive默認可以直接加載文本文件(TextFile),還支持sequence file 、RC file【基於 Hive 的文件格式:RCFile 簡介及其應用
        5.創建表時,指定Hive數據的列分隔符與行分隔符,Hive即可解析數據

六、Hive的數據模型

        6.1 Hive的數據模型-數據庫

            1.類似傳統數據庫的DataBase
            2.默認數據庫"default"     hive> use default;
            3.創建一個新庫   hive > create database test_dw;

         6.2 Hive的數據模型-內部表

            1. 與數據庫中的 Table 在概念上是類似
            2.每一個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表 test,它在 HDFS 中的路徑爲:/user/hive/warehouse/test。
               warehouse是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄。所有的 Table 數據(不包括 External Table)都保存在這個目錄中。
           3.刪除表時,元數據與數據都會被刪除

           4.在本地創建數據文件inner_table.dat
           5.創建表 hive>create table inner_table (key string);
           6.加載數據 hive>load data local inpath '/root/inner_table.dat' into table inner_table;
           7.查看數據  select * from inner_table
                                select count(*) from inner_table
           8.刪除表 drop table inner_table

        6.3 Hive的數據模型-分區表

           1.Partition 對應於數據庫的 Partition 列的密集索引
           2.在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中
             例如:test表中包含 date 和 city 兩個 Partition,則對應於date=20130201, city = bj 的 HDFS 子目錄爲:/warehouse/test/date=20130201/city=bj
                                                                                                     對應於date=20130202, city=sh 的HDFS 子目錄爲;/warehouse/test/date=20130202/city=sh

           3.創建分區表

CREATE TABLE tmp_table #表名
(
title   string, # 字段名稱 字段類型
minimum_bid     double,
quantity        bigint,
have_invoice    bigint
)COMMENT '註釋:XXX' #表註釋
 PARTITIONED BY(pt STRING) #分區表字段(如果你文件非常之大的話,採用分區表可以快過濾出按分區字段劃分的數據)
 ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\001'   # 字段是用什麼分割開的
STORED AS SEQUENCEFILE; #用哪種方式存儲數據,SEQUENCEFILE是hadoop自帶的文件壓縮格式

          4.一些相關命令
             SHOW TABLES; # 查看所有的表
            SHOW TABLES '*TMP*'; #支持模糊查詢
            SHOW PARTITIONS TMP_TABLE; #查看錶有哪些分區
            DESCRIBE TMP_TABLE; #查看錶結構

          5.練習

           創建數據文件 a.c
           創建表    

      create table people(userid int,username string) partitioned by(nation string) row format delimited fields terminated by '\t' stored as TEXTFILE LOCATION '/people'; stored as TEXTFILE;
           加載數據到分區
      load data local inpath '/a.c' into table people  partition (nation='China'); 
           查看數據        
      select * from people;
      select count(*) from people;

           在Hive命令行下在HDFS上創建文件夾並上傳文件

      dfs -mkdir 
      dfs -put /b.j  /people/nation=Japan;
           爲表添加元數據信息
      alter table add partition (nation='Japan') location"/people/nation=Japan";

           查看數據        

      select * from people;     

           刪除分區

      alter table people drop partition (nation='Japan');
           刪除表
      drop table partition_table

       6.4 Hive的數據模型-外部表

           1.指向已經在 HDFS 中存在的數據,可以創建 Partition
           2.它和 內部表 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異
              內部表 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之後對數據的訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。
              外部表 只有一個過程,加載數據和創建表同時完成,並不會移動到數據倉庫目錄中,只是與外部數據建立一個鏈接。當刪除一個外部表時,僅刪除該鏈接。

           3.創建外部表的格式

CREATE EXTERNAL TABLE page_view
( viewTime INT,
  userid BIGINT,
  page_url STRING,     
 referrer_url STRING,                             
  ip STRING COMMENT 'IP Address of the User',
  country STRING COMMENT 'country of origination‘
)
    COMMENT 'This is the staging page view table'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES     TERMINATED BY '12'
    STORED AS TEXTFILE
    LOCATION 'hdfs://centos:9000/user/data/staging/page_view';

           4.練習

           創建數據文件external_table.dat
           創建表
            hive>create external table external_table1 (key string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/home/external';
           在HDFS創建目錄/home/external 並把數據上傳到HDFS上
           #hadoop fs -put  /home/external_table.dat   /home/external
           加載數據
           LOAD DATA INPATH '/home/external_table1.dat' INTO TABLE external_table1;
          查看數據
          select * from external_table
          select count(*) from external_table
          刪除表
          drop table external_table

七、Hive的數據模型-表的操作

        表的修改
          alter table target_tab add columns (cols,string)
        表的刪除
         drop table      
        導入數據

       (1)當數據被加載至表中時,不會對數據進行任何轉換。Load 操作只是將數據複製/移動至 Hive 表對應的位置。
       (2)格式:   

        LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]    INTO TABLE tablename    [PARTITION (partcol1=val1, partcol2=val2 ...)]
       (3)把一個Hive表導入到另一個已建Hive表   

                 方式一

        INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement FROM from_statement
                方式二
        CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
	       (col_name data_type, ...)	…
	        AS SELECT …
          查詢

          (1)格式  

        SELECT [ALL | DISTINCT] select_expr, select_expr, ...
	FROM table_reference 
	[WHERE where_condition] 
	[GROUP BY col_list] 
	[ CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] | [ORDER BY col_list] ]
	[LIMIT number]
               其中 DISTRIBUTE BY 指定分發器(Partitioner),多Reducer可用

          (2)基於Partition的查詢 
                 一般 SELECT 查詢是全表掃描。但如果是分區表,查詢就可以利用分區剪枝(input pruning)的特性,類似“分區索引“”,只掃描一個表中它關心的那一部分。Hive 當前  的實現是,只有分區斷言(Partitioned by)出現在離 FROM 子句最近的那個WHERE 子句中,纔會啓用分區剪枝。例如,如果 page_views 表(按天分區)使用 date 列分區,以下語句只會讀取分區爲‘2008-03-01’的數據。

       SELECT page_views.*    FROM page_views    WHERE page_views.date >= '2013-03-01' AND page_views.date <= '2013-03-01'
          (3)IMIT Clause
                  Limit 可以限制查詢的記錄數。查詢的結果是隨機選擇的。下面的查詢語句從 t1 表中隨機查詢5條記錄:
         SELECT * FROM t1 LIMIT 5
          (4)Top N查詢

                 下面的查詢語句查詢銷售記錄最大的 5 個銷售代表。

         SELECT * FROM sales SORT BY amount DESC LIMIT 5
       表的連接        

        (1)內連接

         select b.name,a.* from dim_ac a join acinfo b on (a.ac=b.acip) limit 10;
        (2)左外連接
         select b.name,a.* from dim_ac a left outer join acinfo b on a.ac=b.acip limit 10;
八、Hive的API

      JAVA客戶端相關代碼:

Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive://192.168.1.102:10000/wlan_dw", " root", "123");
Statement stmt = con.createStatement();
String querySQL="SELECT * FROM wlan_dw.dim_m order by flux desc limit 10";

ResultSet res = stmt.executeQuery(querySQL);  

while (res.next()) {
System.out.println(res.getString(1) +"\t" +res.getLong(2)+"\t" +res.getLong(3)+"\t" +res.getLong(4)+"\t" +res.getLong(5));
}



 
 






    
    

               





      

  


         








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章