Hive的基本概念,基本操作

基本數據類型

Hive數據類型

Java數據類型

長度

例子

TINYINT

byte

1byte有符號整數

20

SMALINT

short

2byte有符號整數

20

INT

int

4byte有符號整數

20

BIGINT

long

8byte有符號整數

20

BOOLEAN

boolean

布爾類型,true或者false

TRUE  FALSE

FLOAT

float

單精度浮點數

3.14159

DOUBLE

double

雙精度浮點數

3.14159

STRING

string

字符系列。可以指定字符集。可以使用單引號或者雙引號。

‘now is the time’ “for all good men”

TIMESTAMP

 

時間類型

 

BINARY

 

字節數組

 

對於Hive的String類型相當於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它可以存儲2GB的字符數。

集合數據類型

數據類型

描述

語法示例

STRUCT

和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, last STRING},那麼1個元素可以通過字段.first來引用

struct()

例如struct<street:string, city:string>

MAP

MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那麼可以通過字段名[last]獲取最後一個元素

map()

例如map<string, int>

ARRAY

數組是一組具有相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值爲[‘John’, ‘Doe’],那麼2個元素可以通過數組名[1]進行引用

Array()

例如array<string>

 

Hive有三種複雜數據類型ARRAY、MAP 和 STRUCT。ARRAY和MAP與Java中的Array和Map類似,而STRUCT與C語言中的Struct類似,它封裝了一個命名字段集合,複雜數據類型允許任意層次的嵌套。

 類型轉化

Hive的原子數據類型是可以進行隱式轉換的,類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤,除非使用CAST操作。

1.隱式類型轉換規則如下

(1)任何整數類型都可以隱式地轉換爲一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。

(2)所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。

(3)TINYINT、SMALLINT、INT都可以轉換爲FLOAT。

(4)BOOLEAN類型不可以轉換爲任何其它的類型。

2.可以使用CAST操作顯示進行數據類型轉換

例如CAST('1' AS INT)將把字符串'1' 轉換成整數1;如果強制類型轉換失敗,如執行CAST('X' AS INT),表達式返回空值 NULL。

 

DDL數據定義

4.1 創建數據庫

CREATE DATABASE [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path]

[WITH DBPROPERTIES (property_name=property_value, ...)];

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

hive (default)> create database db_hive;

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

hive (default)> create database db_hive;

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

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

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

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

 

圖6-4 數據庫存放位置

4.2 查詢數據庫

4.2.1 顯示數據庫

1.顯示數據庫

hive> show databases;

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

hive> show databases like 'db_hive*';

OK

db_hive

db_hive_1

4.2.2 查看數據庫詳情

1.顯示數據庫信息

hive> desc database db_hive;

OK

db_hive     hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db atguiguUSER     

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

hive> desc database extended db_hive;

OK

db_hive     hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db atguiguUSER 

4.2.3 切換當前數據庫

hive (default)> use db_hive;

4.3 修改數據庫

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

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

hive中查看修改結果

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    atguigu USER    {createtime=20170830}

4.4 刪除數據庫

1.刪除空數據庫

hive>drop database db_hive2;

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

hive> drop database db_hive;

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;

4.5 創建表

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]

[TBLPROPERTIES (property_name=property_value, ...)]

[AS select_statement]

2.字段解釋說明

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

(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時可以指定一個指向實際數據的路徑(LOCATION),在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據

(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確定表的具體的列的數據。

SerDe是Serialize/Deserilize的簡稱, hive使用Serde進行行對象的序列與反序列化。

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

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

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

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

10AS:後跟查詢語句,根據查詢結果創建表。

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

4.5.1 管理表

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 

4.5.2 外部表

1.理論

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

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

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

3.案例實操

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

  1. 上傳數據到HDFS

hive (default)> dfs -mkdir /student;

hive (default)> dfs -put /opt/module/datas/student.txt /student;

       (2)建表語句

              創建外部表

hive (default)> create external table stu_external(

id int,

name string)

row format delimited fields terminated by '\t'

location '/student';

       (3)查看創建的表

hive (default)> select * from stu_external;

OK

stu_external.id stu_external.name

1001    lisi

1002    wangwu

1003    zhaoliu

       (4)查看錶格式化數據

hive (default)> desc formatted dept;

Table Type:             EXTERNAL_TABLE

       (5)刪除外部表

hive (default)> drop table stu_external;

外部表刪除後,hdfs中的數據還在,但是metadata中stu_external的元數據已被刪除

4.5.3 管理表與外部表的互相轉換

(1)查詢表的類型

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE

(2)修改內部表student2爲外部表

alter table student2 set tblproperties('EXTERNAL'='TRUE');

(3)查詢表的類型

hive (default)> desc formatted student2;

Table Type:             EXTERNAL_TABLE

(4)修改外部表student2爲內部表

alter table student2 set tblproperties('EXTERNAL'='FALSE');

(5)查詢表的類型

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE

注意:('EXTERNAL'='TRUE')('EXTERNAL'='FALSE')爲固定寫法,區分大小寫!

4.6 分區表

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

4.6.1 分區表基本操作

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’);

注意:分區表加載數據時,必須指定分區

 

圖6-5 加載數據到分區表

 

圖6-6 分區表

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   

4.6.2 分區表注意事項

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';

4.7 修改表

4.7.1 重命名錶

1.語法

ALTER TABLE table_name RENAME TO new_table_name

2.實操案例

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

4.7.2 增加、修改和刪除表分區

詳見4.6.1分區表基本操作。

4.7.3 增加/修改/替換列信息

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;

4.8 刪除表

hive (default)> drop table dept_partition;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了521 篇原創文章 · 獲贊 80 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章