Hive HQL學習


HQL學習

 

1.hive的數據類型

2.hive_DDL

2.1創建、刪除、修改、使用數據庫
 
 
Default數據庫,默認的,優先級相對於其他數據庫是最高的
 

2.2重點:創建表_內部表_外部表

hive通過sql來分析hdfs上結構化的數據,將數據文件映射為表的結構
  1.  create table person(
  2.  id int,
  3.  name string,
  4.  age int,
  5.  likes array<string>,
  6.  address map<string,string>
  7. )
  8.  row format delimited
  9.  FIELDS TERMINATED BY ','
  10.  COLLECTION ITEMS TERMINATED BY '-'
  11.  MAP KEYS TERMINATED BY ':'
  12.  lines terminated by '\n';
  13. Select address[‘city’] from person where name=‘zs
第一點注意:ROW FORMAT row_format
 
 
序列化和反序列化要對數據文件進行拆分映射到表里面,那么ROW FORMAT 加上 DELIMITED 就是指定序列化和反序列化的規則,通俗講就是如何進行數據的拆分,重寫的規則就是 ROW FORMAT  加上 SERDE
 
比如:
 
FIELDS TERMINATED BY ','        指定一行數據的字段按照,分割
COLLECTION ITEMS TERMINATED BY '-'    如果是集合,按照-分割集合中的每個元素
MAP KEYS TERMINATED BY ':'  map類型的按照:分割
LINES TERMINATED BY '\N'    行之間按照換行符分割,這也是默認的
 
第二點注意:STORED AS file_format
 它指定文件在hdfs上以什么格式進行存儲,默認是TEXTFILE
其他幾種方式在存儲時可以指定壓縮,使用壓縮(好處:減少磁盤占用空間,壞處:寫的時候進行壓縮,讀的時候進行解壓縮,都需要占用cpu資源,效率會打折扣)
 
第三點注意:定義字段時的特殊類型(array,map,struct)
 
 
第四點注意:想想插入測試數據(上面的那三條)會用insert語句么?
也可以,但是不會那樣做,因為insert底層轉化為MR
所以這里采用另一種方式:
LOCAL如果數據存在本地需要加LOCAL;如果存在hdfs上就不用了
                 如果是本地,那麽這種方式先上傳到hdfs中一個臨時文件,再將臨時文件移動到hive中對應的數據存放目錄下
                 如果是將hdfs中的數據加載進表,那么這種方式實際是講hdfs中的數據文件移動到了hive的dir下(/user/hive/warehouse)
 
第五點注意:外部表
創建外部表時,需要指定數據存放的位置
創建外部表,會在hdfs中LOCATION指定的路徑下創建和表名對應的目錄
(而創建內部表,會在hive-site.xml中配置的dir下創建對應的目錄)
 

 刪除內部表和外部表的區別?

1.刪除內部表,會元數據信息聯同數據一塊進行刪除( 內部表數據的維護交由hive本身進行管理
2.刪除外部表,只會刪除元數據信息,但是在hdfs上存儲的數據還在( 外部表則不是
 
truncate table 表名
 
第六點注意:將子查詢的結果存儲到新表中
第一步:創建了表;第二部:將查出的結果插入到表中(注意這種方式在創建表時不能指定列,否則就會報錯)
 
6.1這種方式什么時候會用?
    創建中間表的時候,如果需要一些數據可以通過這種方式來做。
6.2這種方式和  create table psn4 like psn3 的區別?
 

3.hive_分區

1.分區表什么時候會用?

舉例一:比如有一張人員表,分析一些日志數據,可以按照天進行分區,那么每一天的數據會存放在對應的分區中(會存儲在每一天的目錄下面)
舉例二:有一個很大的表,里面存放了很多的日志,這時候可以采用分區,進行標識,分塊管理
 
注意:分區的字段一定不能在表的列名里面
 

2.分區表的創建,添加數據,查看對應分區下的數據,修改分區、刪除分區

創建帶有分區的表psn5
 
創建了分區,進行插入數據,就需要指定分區字段,否則就會報錯
 
查看表,發現有兩個分區(boy, girl)
 
在hdfs中查看,發現目錄下有兩個目錄對應兩個分區
 
查看指定分區下的數據
select * from psn5 where sex = 'boy'
 
添加分區
ALTER TABLE psn5 ADD PARTITION (sex = 'weizhi')              //在一個表中添加一個分區
ALTER TABLE psn5 DROP PARTITION (sex = 'weizhi')            //同時刪除對應分區中的數據
 
  1. ---分區_指定兩個分區字段
  2. create table psn5(
  3. id int,
  4. name string,
  5. likes ARRAY <string>,
  6. address MAP <string, string>
  7. )
  8. PARTITIONED BY(sex stringage int)
  9. ROW FORMAT DELIMITED
  10. FIELDS TERMINATED BY ','
  11. COLLECTION ITEMS TERMINATED BY '-'
  12. MAP KEYS TERMINATED BY ':';
  13. ---創建分區后,再進行插入數據,就需要指定分區字段
  14. load data local inpath '/root/data' into table psn5 partition (sex='boy',age=1);
刪除分區的時候,一定要注意(分區下可能還有分區)
 

4.hive_DML

重點掌握1:load data方式,2:from insert ...插入數據
1.創建psn7,將數據從psn1中查出來,插入到psn7中
  1. create table psn7 like psn1;
  2. from psn1
  3. insert into table psn7 select id, name, likes, address
思考一:hive其實就是寫sql來分析hdfs上的數據,那么問題來了,以上這種方式做什么用?
     比如我們要分析一個WordCount,那么結果只是顯示在控制台么,顯然不是,我們要將hive sql運行的結果存儲到另一張表中
為什么要將from放在上面呢?
    我們將對同一張表分析的多個指標寫到結果表中,就不用寫多個sql了,要不還需要join


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM