一、Hive建表語句
(1)創建內部表
(2)創建外部表
drop table yum_area_dw.dw_community_base_info_aoi_clean; CREATE EXTERNAL TABLE `yum_area_dw.dw_community_base_info_aoi_clean`( `id` bigint comment '小區id', `community_name` string comment '小區名稱', `city_id` bigint comment '城市id') comment '表備注' PARTITIONED BY ( dt string comment '日期分區') row format delimited fields terminated by '\u0001' lines terminated by '\n' stored as textfile;
二、數據導入
1、Hive客戶端中將數據導入hive表:根據數據源不同划分
(1)從本地文件系統中導入數據到hive表中:
load data local inpath "path" [OVERWRITE] into table tablename;
(2)從HDFS上導入數據到hive表中:
load data inpath "path" [OVERWRITE] into table tablename;
(3)從別的表查詢出來的數據導入到hive表中:
insert overwrite table tablename_1 partition()
select .... from tablename_2 where ......
三、內部表和外部表
1、Hive內部表和外部表區別:主要分為兩方面,數據加載load、刪除表drop。
數據加載:創建內部表時,會將數據移動到hive指向的路徑,並且由hive來管理數據的生命周期。
創建外部表時,只是記錄數據所在的路徑,不對數據位置做改變。
刪除表:刪除內部表,數據和元數據會一起刪除掉。
刪除外部表,只是刪除元數據,數據不會刪除。
四、分區和分桶
1、分區:分區是指按照數據表的某列或某些列分為多個區,區從形式上可以理解為文件夾,比如我們要收集某個大型網站的日志數據,一個網站每天的日志數據存在同一張表上,由於每天會生成大量的日志,導致數據表的內容巨大,在查詢時進行全表掃描耗費的資源非常多。那其實這個情況下,我們可以按照日期對數據表進行分區,不同日期的數據存放在不同的分區,在查詢時只要指定分區字段的值就可以直接從該分區查找,避免全表掃描,可以提高查詢效率。
注意:分區只是添加了一個偽列,這個偽劣使我們人為規定的,只在查詢的時候顯示,實際在表中並不存在這個列。不能按照某個數據表中真實存在的列,如userid來分區。
分區的目的就是提高查詢效率,查詢分區數據的方式就是指定分區名,指定分區名之后就不再全表掃描,直接從指定分區(如name=jack的分區)中查詢,從hdfs的角度看就是從相應的文件系統中(如name=jack文件夾下)去查找特定的數據
create table dept_partition(deptno int , dname string,loc string)
partitioned by (month string)
row format delimited fields terminated by '\t';
2、分桶:分桶是相對分區進行更細粒度的划分。分桶將整個數據內容按照某列屬性值的hash值進行區分,如要按照name屬性分為3個桶,就是對name屬性值的hash值對3取摸,按照取模結果對數據分桶。如取模結果為0的數據記錄存放到一個文件,取模為1的數據存放到一個文件,取模為2的數據存放到一個文件。
注意:分桶的列是表中已存在的列,而不是偽列。分桶的信息在hdfs上看不到相關的文件,但是可以查詢到分桶中的數據,說明確實分桶了。
create table test_bucket (
id int comment 'ID', name string comment '名字' ) comment '測試分桶' clustered by(id) into 4 buckets ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
3、分區和分桶的區別:
(1)分區是指定偽列進行分區,分桶是表格中真實存在的列。
(2)分區信息在hdfs上顯示的是分區文件夾,而分桶在hdfs上看不到,但是查詢分桶數據們可以查詢到。
(3)分桶是數據的更精細的划分。
4、分桶的使用場景:
(1)當使用分區進行數據划分的時候,出現有些分區數據過多,而有些分區數據過少的時候,這時候可以采用分桶,對數據進行划分。
(2)提升Join查詢的效率,若兩個表都在連接的字段上進行了分桶,那么在join的時候可以使用 Map 端連接 (Map-side join)高效的實現。比如Join 操作。對於Join 操作兩個表有一個相同的列,如果對這兩個表都進行了分桶操作。那么將保存相同列值的桶進行Join 操作就可以,可以大大減少Join 數據量。
(3)方便抽樣:使取樣(sampling)更高效。在處理大規模數據集時,在開發和修改查詢的階段,如果能在數據集的一小部分數據上試運行查詢,會帶來很多方便。