HQL學習

1.hive的數據類型

2.hive_DDL
2.1創建、刪除、修改、使用數據庫




2.2重點:創建表_內部表_外部表
hive通過sql來分析hdfs上結構化的數據,將數據文件映射為表的結構
– create table person(
– id int,
– name string,
– age int,
– likes array<string>,
– address map<string,string>
–)
– row format delimited
– FIELDS TERMINATED BY ','
– COLLECTION ITEMS TERMINATED BY '-'
– MAP KEYS TERMINATED BY ':'
– lines terminated by '\n';
–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') //同時刪除對應分區中的數據
---分區_指定兩個分區字段
create table psn5(
id int,
name string,
likes ARRAY <string>,
address MAP <string, string>
)
PARTITIONED BY(sex string,age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':';
---創建分區后,再進行插入數據,就需要指定分區字段
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中
create table psn7 like psn1;
from psn1
insert into table psn7 select id, name, likes, address

思考一:hive其實就是寫sql來分析hdfs上的數據,那么問題來了,以上這種方式做什么用?
比如我們要分析一個WordCount,那么結果只是顯示在控制台么,顯然不是,我們要將hive sql運行的結果存儲到另一張表中
為什么要將from放在上面呢?
我們將對同一張表分析的多個指標寫到結果表中,就不用寫多個sql了,要不還需要join
