Hive專題五---DDL之數據庫-表基本操作

版權聲明:本文爲博主原創文章,轉載請註明出處。

交流QQ: 824203453

歡迎訪問:https://blog.csdn.net/qq_21439395

歡迎訪問博主個人主頁:http://www.oldsheep.cn 

 

創建數據庫

1)創建一個數據庫,數據庫在HDFS上的默認存儲路徑是/user/hive/warehouse/*.db。

hive (default)> create database db_hive;

2)避免要創建的數據庫已經存在錯誤,增加if not exists判斷。(標準寫法)

hive> create database db_hive;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database db_hive already exi

Sts

hive (default)> create database if not exists db_hive;

3)創建一個數據庫,指定數據庫在HDFS上存放的位置

hive (default)> create database db_hive2 location '/db_hive2.db';

 

4.2 修改數據庫

用戶可以使用ALTER DATABASE命令爲某個數據庫的DBPROPERTIES設置鍵-值對屬性值,來描述這個數據庫的屬性信息。數據庫的其他元數據信息都是不可更改的,包括數據庫名和數據庫所在的目錄位置。

hive (default)> alter database db_hive set dbproperties('createtime'='20170830');

mysql中查看修改結果

hive> desc database extended db_hive;

db_name comment location        owner_name      owner_type      parameters

db_hive         hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db    root USER    {createtime=20170830}

4.3 查詢數據庫

4.3.1 顯示數據庫

1)顯示數據庫

hive> show databases;

2)過濾顯示查詢的數據庫

 hive> show databases like 'db_hive*';

OK

db_hive

db_hive_1

4.3.2 查看數據庫詳情

1)顯示數據庫信息

hive> desc database db_hive;

OK

db_hive          hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db     rootUSER     

2)顯示數據庫詳細信息,extended

hive> desc database extended db_hive;

OK

db_hive          hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db     rootUSER     

4.3.3 切換當前數據庫

hive (default)> use db_hive;

4.4 刪除數據庫

1)刪除空數據庫

hive>drop database db_hive2;

2)如果刪除的數據庫不存在,最好採用 if exists判斷數據庫是否存在

hive> drop database db_hive2;

FAILED: SemanticException [Error 10072]: Database does not exist: db_hive

hive> drop database if exists db_hive2;

3)如果數據庫不爲空,可以採用cascade命令,強制刪除


hive> drop database db_hive;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)

hive> drop database db_hive cascade;

 

創建表

1)建表語法


CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name, col_name, ...)

[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

 

2)字段解釋說明:

(1)CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常。

(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION),Hive創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。

(3)COMMENT:爲表和列添加註釋。

(4)PARTITIONED BY創建分區表

(5)CLUSTERED BY創建分桶表

(6)SORTED BY不常用

(7)ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

   | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

用戶在建表的時候可以自定義SerDe或者使用自帶的SerDe。如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe。在建表的時候,用戶還需要爲表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數據。

(8)STORED AS指定存儲文件類型

常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本)、RCFILE(列式存儲格式文件)

如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據需要壓縮,使用 STORED AS SEQUENCEFILE。

9LOCATION :指定表在HDFS上的存儲位置。

(10)LIKE允許用戶複製現有的表結構,但是不復制數據。

管理表

1)理論

默認創建的表都是所謂的管理表,有時也被稱爲內部表。因爲這種表,Hive會(或多或少地)控制着數據的生命週期。Hive默認情況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。    當我們刪除一個管理表時,Hive也會刪除這個表中數據。管理表不適合和其他工具共享數據。

2)案例實操

(1)普通創建表

create table if not exists student2(

id int, name string

)

row format delimited fields terminated by '\t'

stored as textfile

location '/user/hive/warehouse/student2';

 

(2)根據查詢結果創建表(查詢的結果會添加到新創建的表中)

create table if not exists student3

as select id, name from student;

 

(3)根據已經存在的表結構創建表


create table if not exists student4 like student;


(4)查詢表的類型

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE 

分區表

分區表實際上就是對應一個HDFS文件系統上的獨立的文件夾,該文件夾下是該分區所有的數據文件。Hive中的分區就是分目錄,把一個大的數據集根據業務需要分割成小的數據集。在查詢時通過WHERE子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。

外部表

1)理論

因爲表是外部表,所以Hive並非認爲其完全擁有這份數據。刪除該表並不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。

2)管理表和外部表的使用場景:

每天將收集到的網站日誌定期流入HDFS文本文件。在外部表(原始日誌表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存儲,數據通過SELECT+INSERT進入內部表。

3)案例實操

分別創建部門和員工外部表,並向表中導入數據。

(1)原始數據  dept.txt emp.txt

(2)建表語句

              創建部門表

create external table if not exists default.dept(

deptno int,

dname string,

loc int

)

row format delimited fields terminated by '\t';


      創建員工表   

create external table if not exists default.emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int)

row format delimited fields terminated by '\t';

 

(3)查看創建的表

hive (default)> show tables;

OK

tab_name

dept

emp

       (4)向外部表中導入數據

              導入數據

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept;

hive (default)> load data local inpath '/opt/module/datas/emp.txt' into table default.emp;

查詢結果

hive (default)> select * from emp;

hive (default)> select * from dept;

       (5)查看錶格式化數據

hive (default)> desc formatted dept;

Table Type:             EXTERNAL_TABLE

分區表基本操作

1)引入分區表(需要根據日期對日誌進行管理)

/user/hive/warehouse/log_partition/20170702/20170702.log

/user/hive/warehouse/log_partition/20170703/20170703.log

/user/hive/warehouse/log_partition/20170704/20170704.log

2)創建分區表語法

hive (default)> create table dept_partition(

deptno int, dname string, loc string

)

partitioned by (month string)

row format delimited fields terminated by '\t';

 

3)加載數據到分區表中

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition partition(month='201709');

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition partition(month='201708');

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition partition(month='201707');

 

4)查詢分區表中數據

       單分區查詢

hive (default)> select * from dept_partition where month='201709';

多分區聯合查詢

hive (default)> select * from dept_partition where month='201709'
union
select * from dept_partition where month='201708'
union
select * from dept_partition where month='201707';

 

_u3.deptno      _u3.dname       _u3.loc _u3.month

10      ACCOUNTING      NEW YORK        201707

10      ACCOUNTING      NEW YORK        201708

10      ACCOUNTING      NEW YORK        201709

20      RESEARCH        DALLAS  201707

20      RESEARCH        DALLAS  201708

20      RESEARCH        DALLAS  201709

30      SALES   CHICAGO 201707

30      SALES   CHICAGO 201708

30      SALES   CHICAGO 201709

40      OPERATIONS      BOSTON  201707

40      OPERATIONS      BOSTON  201708

40      OPERATIONS      BOSTON  201709

5)增加分區

       創建單個分區

hive (default)> alter table dept_partition add partition(month='201706') ;

       同時創建多個分區

hive (default)>  alter table dept_partition add partition(month='201705') partition(month='201704');

6)刪除分區

       刪除單個分區

hive (default)> alter table dept_partition drop partition (month='201704');

同時刪除多個分區

hive (default)> alter table dept_partition drop partition (month='201705'), partition (month='201706');

7)查看分區表有多少分區

hive>show partitions dept_partition;

8)查看分區表結構

hive>desc formatted dept_partition;
# Partition Information         
# col_name              data_type               comment            
month                   string   

分區表注意事項

1)創建二級分區表

hive (default)> create table dept_partition2(
 deptno int, dname string, loc string
)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';

2)正常的加載數據

(1)加載數據到二級分區表中

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition2 partition(month='201709', day='13');

(2)查詢分區數據

hive (default)> select * from dept_partition2 where month='201709' and day='13';

3)把數據直接上傳到分區目錄上,讓分區表和數據產生關聯的兩種方式

       (1)方式一:上傳數據後修復

       上傳數據

hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=12;
hive (default)> dfs -put /opt/module/datas/dept.txt  /user/hive/warehouse/dept_partition2/month=201709/day=12;

       查詢數據(查詢不到剛上傳的數據)

hive (default)> select * from dept_partition2 where month='201709' and day='12';

執行修復命令

hive>msck repair table dept_partition2;

再次查詢數據

hive (default)> select * from dept_partition2 where month='201709' and day='12';

       (2)方式二:上傳數據後添加分區

       上傳數據

hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=11;
hive (default)> dfs -put /opt/module/datas/dept.txt  /user/hive/warehouse/dept_partition2/month=201709/day=11;

執行添加分區     

hive (default)> alter table dept_partition2 add partition(month='201709', day='11');

 

查詢數據

hive (default)> select * from dept_partition2 where month='201709' and day='11';

       (3)方式三:上傳數據後load數據到分區

              創建目錄

hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=10;

上傳數據

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition2 partition(month='201709',day='10');

查詢數據

hive (default)> select * from dept_partition2 where month='201709' and day='10';

修改表

重命名錶

       (1)語法

ALTER TABLE table_name RENAME TO new_table_name

       (2)實操案例

hive (default)> alter table dept_partition2 rename to dept_partition3;

增加、修改和刪除表分區

詳見4.6.1分區表基本操作。

增加/修改/替換列信息

1)語法

       更新列

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

增加和替換列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)

注:ADD是代表新增一字段,字段位置在所有列後面(partition列前),REPLACE則是表示替換表中所有字段。

2)實操案例

(1)查詢表結構

hive>desc dept_partition;

(2)添加列

hive (default)> alter table dept_partition add columns(deptdesc string);

(3)查詢表結構

hive>desc dept_partition;

(4)更新列

hive (default)> alter table dept_partition change column deptdesc desc int;

(5)查詢表結構

hive>desc dept_partition;

(6)替換列

hive (default)> alter table dept_partition replace columns(deptno string, dname string, loc string);

(7)查詢表結構

hive>desc dept_partition;

刪除表

hive (default)> drop table dept_partition;

 

版權聲明:本文爲博主原創文章,轉載請註明出處。

交流QQ: 824203453

歡迎訪問:https://blog.csdn.net/qq_21439395

歡迎訪問博主個人主頁:http://www.oldsheep.cn 

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