Hive建表


一、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)更高效。在處理大規模數據集時,在開發和修改查詢的階段,如果能在數據集的一小部分數據上試運行查詢,會帶來很多方便。

 


免責聲明!

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



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