hive命令
在安裝Hive的Linux服務(wù)器終端中直接輸入如下命令,可以查看幫助信息:
# hive -help
常用的如-e求厕、-f參數(shù)趣苏。
使用-e參數(shù),可以直接在命令行傳遞SQL語句進行hive表數(shù)據(jù)的查詢:
# hive -e "select * from testhive.testtable"
使用-f參數(shù)凿歼,可以在命令行中傳遞文件進行進行hive表數(shù)據(jù)的查詢褪迟,首先使用如下命令創(chuàng)建一個名為test.hql的文件:
# vim test.hql
在該文件中寫入SQL語句:
select * from testhive.testtable
然后在Linux命令行執(zhí)行如下命令:
# hive -f test.hql
并且該執(zhí)行查詢的結(jié)果可以追加到文件中:
# hive -f test.hql > result.txt
# cat result.txt
執(zhí)行如下命令,可以查看hive中執(zhí)行過的所有歷史命令:
# cat .hivehistory
Hive的其他配置
現(xiàn)在hive查詢出來的數(shù)據(jù)顯示很不友好答憔,為了顯示數(shù)據(jù)頭信息味赃,通過如下配置文件項開啟配置:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
在Hive客戶端中時,為了顯示當前操作哪個數(shù)據(jù)庫虐拓,通過如下配置文件項開啟配置:
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
Hive的set
在Hive的客戶端中心俗,可以使用set命令進行配置,該配置當前操作有效:
hive (default)> set hive.cli.print.current.db=false;
關(guān)閉了當前操作的數(shù)據(jù)庫位置顯示蓉驹。
Hive的數(shù)據(jù)類型
基本數(shù)據(jù)類型
Hive的數(shù)據(jù)類型與Java的數(shù)據(jù)類型對應(yīng)關(guān)系:
Hive數(shù)據(jù)類型 | Java數(shù)據(jù)類型 | 描述 |
---|---|---|
TINYINT | byte | 1byte整數(shù) |
SMALLINT | short | 2byte整數(shù) |
INT | int | 4byte整數(shù) |
BIGINT | long | 8byte整數(shù) |
BOOLEAN | boolean | true/false |
FLOAT | float | 單精度浮點數(shù) |
DOUBLE | double | 雙精度浮點數(shù) |
STRING | string | 字符城榛,可以用單引號或雙引號 |
TIMESTAMP | 時間類型 | |
BINARY | 字節(jié)數(shù)組 |
集合數(shù)據(jù)類型
數(shù)據(jù)類型 | 描述 |
---|---|
STRUCT | 結(jié)構(gòu)體,通過“點”符號訪問元素內(nèi)容 |
MAP | 一組鍵-值對元祖集合戒幔,使用數(shù)組表示法可以訪問數(shù)據(jù) |
ARRAY | 是一組具有想同類型和名稱的變量的集合 |
DDL操作
DDL(Data Definition Language:數(shù)據(jù)定義語言)主要是用在定義表結(jié)構(gòu)吠谢、改變表的結(jié)構(gòu)、改變表數(shù)據(jù)類型诗茎、改變表之間的鏈接和約束等工坊。
創(chuàng)建數(shù)據(jù)庫
創(chuàng)建一個數(shù)據(jù)庫:
> create database db_testdb;
若創(chuàng)建的數(shù)據(jù)庫已經(jīng)存在,則會報錯敢订,這時可以使用if not exists判斷:
> create database if not exists db_testdb;
標準寫法是使用if not exists判斷的創(chuàng)建數(shù)據(jù)庫語句王污。
查詢數(shù)據(jù)庫
查詢Hive中的數(shù)據(jù)庫:
> show databases;
查詢數(shù)據(jù)庫信息:
> desc database db_testdb;
查詢數(shù)據(jù)庫詳細信息(數(shù)據(jù)庫有額外的屬性時):
> desc database extended db_testdb;
切換數(shù)據(jù)庫:
> use testhive;
刪除數(shù)據(jù)庫
刪除空的數(shù)據(jù)庫:
> drop database db_testdb;
若刪除的數(shù)據(jù)庫不存在,則會報錯楚午,這時可以使用if exists判斷:
drop database if exists db_testdb;
使用cascade昭齐,強制刪除有數(shù)據(jù)的數(shù)據(jù)庫:
drop database if exists db_testdb cascade;
創(chuàng)建數(shù)據(jù)庫表
建表語法:
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]
字段解釋說明:
- CREATE TABLE 創(chuàng)建一個指定名字的表,如果相同名字的表已經(jīng)存在矾柜,則拋出異常阱驾;用戶可以用 IF NOT EXISTS 選項來忽略這個異常就谜。
- EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個外部表,在建表的同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION)里覆,Hive創(chuàng)建內(nèi)部表時丧荐,會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表喧枷,僅記錄數(shù)據(jù)所在的路徑虹统,不對數(shù)據(jù)的位置做任何改變。在刪除表的時候隧甚,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會被一起刪除车荔,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)戚扳。
- COMMENT:為表和列添加注釋忧便。
- PARTITIONED BY創(chuàng)建分區(qū)表。
- CLUSTERED BY創(chuàng)建分桶表咖城。
- SORTED BY外部表數(shù)據(jù)源茬腿,例如后續(xù)使用的Hbase數(shù)據(jù)。
- 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確定表的具體的列的數(shù)據(jù)简烘。
SerDe是Serialize/Deserilize的簡稱苔严,目的是用于序列化和反序列化。 - STORED AS指定存儲文件類型
常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)孤澎、TEXTFILE(文本)届氢、RCFILE(列式存儲格式文件)
如果文件數(shù)據(jù)是純文本,可以使用STORED AS TEXTFILE覆旭。如果數(shù)據(jù)需要壓縮退子,使用 STORED AS SEQUENCEFILE。 - LOCATION :指定表在HDFS上的存儲位置型将。
- LIKE允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu)寂祥,但是不復(fù)制數(shù)據(jù)。
內(nèi)部表
默認創(chuàng)建的表都是內(nèi)部表七兜,這類表有Hive控制生命周期丸凭,默認會將表數(shù)據(jù)存儲在配置文件中配置項指定的目錄下:
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/root/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
當刪除內(nèi)部表時,該表的數(shù)據(jù)也會被刪除。
- 創(chuàng)建表
> create table if not exists tableone (id int,name string) row format delimited fields terminated by '\t';
- 根據(jù)已經(jīng)存在的表結(jié)構(gòu)創(chuàng)建表
> create table if not exists tabletwo like tableone;
- 查詢表類型
> desc tableone;
外部表
外部表铛碑,Hive并不完全擁有數(shù)據(jù)。
例如:數(shù)據(jù)存儲在Hbase的表中向拆,此時創(chuàng)建的外部表若刪除亚茬,則數(shù)據(jù)仍然存儲在Hbase中,不會被刪除浓恳。
此處使用前文中的Hbase中的表testtableone(前文連接:http://www.reibang.com/p/cf8730708782),進行操作:
- 創(chuàng)建外部表
create external table if not exists htesttableone (row2 string,info map<string,string>) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,info:") tblproperties("hbase.table.name" = "testtableone");
- 查詢表類型:
> desc formatted htesttableone;
可以看到表類型為外部表:
表類型轉(zhuǎn)換
- 查詢tabletwo表類型:
> desc formatted tabletwo;
- 內(nèi)部表轉(zhuǎn)換為外部表
> alter table tabletwo set tblproperties('EXTERNAL'='TRUE');
- 外部表轉(zhuǎn)換為內(nèi)部表
> alter table tabletwo set tblproperties('EXTERNAL'='FALSE');
修改表名
> alter table tabletwo rename to tablethree;
與Hbase數(shù)據(jù)表關(guān)聯(lián)的Hive外部表碗暗,不能進行表類型轉(zhuǎn)換颈将,也不能修改表名,若需要修改表名則需在Hbase中進行修改言疗。
刪除表
> drop table htesttableone;
刪除外部表晴圾,可以看到Hbase中,該數(shù)據(jù)表仍然存在噪奄,不會被刪除死姚。