Hive數(shù)據(jù)類型和DDL操作

hive命令

在安裝Hive的Linux服務(wù)器終端中直接輸入如下命令,可以查看幫助信息:

# hive -help
Hive使用01.png

常用的如-e、-f參數(shù)。
使用-e參數(shù),可以直接在命令行傳遞SQL語句進(jìn)行hive表數(shù)據(jù)的查詢:

# hive -e "select * from testhive.testtable"
Hive使用02.png

使用-f參數(shù),可以在命令行中傳遞文件進(jìn)行進(jìn)行hive表數(shù)據(jù)的查詢,首先使用如下命令創(chuàng)建一個(gè)名為test.hql的文件:

# vim test.hql

在該文件中寫入SQL語句:

select * from testhive.testtable

然后在Linux命令行執(zhí)行如下命令:

# hive -f test.hql
Hive使用03.png

并且該執(zhí)行查詢的結(jié)果可以追加到文件中:

# hive -f test.hql > result.txt
# cat result.txt
Hive使用04.png

執(zhí)行如下命令,可以查看hive中執(zhí)行過的所有歷史命令:

# cat .hivehistory
Hive使用05.png

Hive的其他配置

現(xiàn)在hive查詢出來的數(shù)據(jù)顯示很不友好,為了顯示數(shù)據(jù)頭信息,通過如下配置文件項(xiàng)開啟配置:

<property>
  <name>hive.cli.print.header</name>
  <value>true</value>
</property>
Hive使用06.png

在Hive客戶端中時(shí),為了顯示當(dāng)前操作哪個(gè)數(shù)據(jù)庫,通過如下配置文件項(xiàng)開啟配置:

<property>
  <name>hive.cli.print.current.db</name>
  <value>true</value>
</property>
Hive使用07.png

Hive使用08.png

Hive的set

在Hive的客戶端中,可以使用set命令進(jìn)行配置,該配置當(dāng)前操作有效:

hive (default)> set hive.cli.print.current.db=false;
Hive使用09.png

關(guān)閉了當(dāng)前操作的數(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 單精度浮點(diǎn)數(shù)
DOUBLE double 雙精度浮點(diǎn)數(shù)
STRING string 字符,可以用單引號或雙引號
TIMESTAMP 時(shí)間類型
BINARY 字節(jié)數(shù)組

集合數(shù)據(jù)類型

數(shù)據(jù)類型 描述
STRUCT 結(jié)構(gòu)體,通過“點(diǎn)”符號訪問元素內(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)建一個(gè)數(shù)據(jù)庫:

 > create database db_testdb;

若創(chuàng)建的數(shù)據(jù)庫已經(jīng)存在,則會(huì)報(bào)錯(cuò),這時(shí)可以使用if not exists判斷:

> create database if not exists db_testdb;

Hive使用10.png


標(biāo)準(zhǔn)寫法是使用if not exists判斷的創(chuàng)建數(shù)據(jù)庫語句。

查詢數(shù)據(jù)庫

查詢Hive中的數(shù)據(jù)庫:

> show databases;

查詢數(shù)據(jù)庫信息:

> desc database db_testdb;

查詢數(shù)據(jù)庫詳細(xì)信息(數(shù)據(jù)庫有額外的屬性時(shí)):

> desc database extended db_testdb;

切換數(shù)據(jù)庫:

> use testhive;
Hive使用11.png

刪除數(shù)據(jù)庫

刪除空的數(shù)據(jù)庫:

> drop database db_testdb;

若刪除的數(shù)據(jù)庫不存在,則會(huì)報(bào)錯(cuò),這時(shí)可以使用if exists判斷:

drop database if exists db_testdb;

使用cascade,強(qiáng)制刪除有數(shù)據(jù)的數(shù)據(jù)庫:

drop database if exists db_testdb cascade;
Hive使用12.png

創(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)建一個(gè)指定名字的表,如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項(xiàng)來忽略這個(gè)異常。
  • EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(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, ...)]
    用戶在建表的時(shí)候可以自定義SerDe或者使用自帶的SerDe。如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會(huì)使用自帶的SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數(shù)據(jù)。
    SerDe是Serialize/Deserilize的簡稱,目的是用于序列化和反序列化。
  • STORED AS指定存儲文件類型
    常用的存儲文件類型:SEQUENCEFILE(二進(jìn)制序列文件)、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)部表

默認(rèn)創(chuàng)建的表都是內(nèi)部表,這類表有Hive控制生命周期,默認(rèn)會(huì)將表數(shù)據(jù)存儲在配置文件中配置項(xiàng)指定的目錄下:

  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/root/hive/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>

當(dāng)刪除內(nèi)部表時(shí),該表的數(shù)據(jù)也會(huì)被刪除。
\color{red}{說明:內(nèi)部表不適合與其他工具共享數(shù)據(jù)。}

  1. 創(chuàng)建表
> create table if not exists tableone (id int,name string) row format delimited fields terminated by '\t';
  1. 根據(jù)已經(jīng)存在的表結(jié)構(gòu)創(chuàng)建表
> create table if not exists tabletwo like tableone;
  1. 查詢表類型
> desc tableone;
Hive使用13.png

外部表

外部表,Hive并不完全擁有數(shù)據(jù)。
例如:數(shù)據(jù)存儲在Hbase的表中,此時(shí)創(chuàng)建的外部表若刪除,則數(shù)據(jù)仍然存儲在Hbase中,不會(huì)被刪除。
此處使用前文中的Hbase中的表testtableone(前文連接:http://www.itdecent.cn/p/cf8730708782),進(jìn)行操作:

Hive使用14.png

  1. 創(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");
Hive使用15.png
  1. 查詢表類型:
> desc formatted htesttableone;

可以看到表類型為外部表:


Hive使用16.png

表類型轉(zhuǎn)換

  1. 查詢tabletwo表類型:
> desc formatted tabletwo;
Hive使用17.png
  1. 內(nèi)部表轉(zhuǎn)換為外部表
> alter table tabletwo set tblproperties('EXTERNAL'='TRUE');
Hive使用18.png
  1. 外部表轉(zhuǎn)換為內(nèi)部表
> alter table tabletwo set tblproperties('EXTERNAL'='FALSE');
Hive使用19.png

修改表名

> alter table tabletwo rename to tablethree;

Hive使用20.png


與Hbase數(shù)據(jù)表關(guān)聯(lián)的Hive外部表,不能進(jìn)行表類型轉(zhuǎn)換,也不能修改表名,若需要修改表名則需在Hbase中進(jìn)行修改。

刪除表

> drop table htesttableone;

刪除外部表,可以看到Hbase中,該數(shù)據(jù)表仍然存在,不會(huì)被刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容