HIVE基礎詳解

2021-08-23 14:15:36 字數 4567 閱讀 7105

tinyint	 1byte,-128 ~ 127	

smallint 2byte,-32,768 ~ 32,767

int 4byte -2,147,483,648 ~ 2,147,483,647

bigint 8byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

boolean

float 4byte單精度

double 8byte雙精度

string

timestamp 時間戳,納秒精度

decimal 任意精度的帶符號小數

char 固定長度字串

varchar 變長字串

date 日期

複雜型別:

map:map包含key->value鍵值對,可以通過key來訪問元素。比如"userlist"是乙個map型別,其中username是key,password是value;那麼我們可以通過userlist['username']來得到這個使用者對應的password;

create table employees (

name string,

salary float,

subordinates array,

deductions map,

address struct) partitioned by (country string, state string)

row format delimited

fields terminated by ','

collection items terminated by '-'

map keys terminated by ':'

lines terminated by "\n";

array 通過索引訪問: select subordinates[0] from employees;

map 通過key 訪問: select deductions["a1"] from employees;

struct 通過字段訪問: select address.country from employees;

1、表:hive中的表和關係型資料庫中的表在概念上很類似,每個表在hdfs中都有相應的目錄用來儲存表的資料,這個目錄可以通過$/conf/hive-site.xml配置檔案中的hive.metastore.warehouse.dir屬性來配置,這個屬性預設的值是**/user/hive/warehouse(這個目錄在hdfs上)**,我們可以根據實際的情況來修改這個配置。如果我有乙個表wyp,那麼在hdfs中會建立/user/hive/warehouse/wyp目錄(這裡假定hive.metastore.warehouse.dir配置為/user/hive/warehouse);wyp表所有的資料都存放在這個目錄中。這個例外是外部表。

2、外部表:hive中的外部表和表很類似,但是其資料不是放在自己表所屬的目錄中,而是存放到別處,這樣的好處是如果你要刪除這個外部表,該外部表所指向的資料是不會被刪除的,它只會刪除外部表對應的元資料;而如果你要刪除表,該錶對應的所有資料報括元資料都會被刪除。

3、分割槽:在hive中,表的每乙個分割槽對應表下的相應目錄,所有分割槽的資料都是儲存在對應的目錄中。比如wyp表有dt和city兩個分割槽,則對應dt=20131218,city=bj對應表的目錄為/user/hive/warehouse/dt=20131218/city=bj,所有屬於這個分割槽的資料都存放在這個目錄中。

4、桶:對指定的列計算其hash,根據hash值切分資料,目的是為了並行,每乙個桶對應乙個檔案(注意和分割槽的區別)。比如將wyp表id列分散至16個桶中,首先對id列的值計算hash,對應hash值為0和16的資料儲存的hdfs目錄為:/user/hive/warehouse/wyp/part-00000;而hash值為2的資料儲存的hdfs 目錄為:/user/hive/warehouse/wyp/part-00002。

hive中的元資料報括表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。由於hive的元資料需要不斷的更新、修改,而hdfs系統中的檔案是多讀少改的,這顯然不能將hive的元資料儲存在hdfs中。目前hive將元資料儲存在資料庫中,如mysql、derby中。我們可以通過以下的配置來修改hive元資料的儲存方式。

從本地檔案系統中匯入資料到hive表

從本地檔案系統中將資料匯入到hive表的過程中,其實是先將資料臨時複製到hdfs的乙個目錄下,然後再將資料從那個臨時目錄下移動到對應的hive表的資料目錄裡面。

load data local inpath 『/本地檔案路徑』 into table 表名;

從hdfs上匯入資料到hive表

將資料直接從hdfs上的乙個目錄移動到相應hive表的資料目錄下

load data inpath 『hdfs路徑』 into table 表名;

overwrite into table tablename 與 into table tablename的區別?

overwrite 會清除表中內容,重新匯入資料,into不會清除老的資料,追加新的資料

從別的表中查詢出相應的資料並匯入到hive表中

insert into table 表名1 select id, name, tel from 表名2;

在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中

create table 表名1 as select id, name, tel from 表名2;

匯出到本地檔案系統

insert overwrite local directory 『/本地路徑』 select * from 表名;

匯出到hdfs中

insert overwrite directory 『/hdfs路徑』 select * from 表名;

匯出到hive的另乙個表中

insert into table 表名1 select id, name, tel from 表名2;

修改日誌級別:

控制台修改: hive --hiveconf hive.root.logger=debug,console,此種方法修改,對本次執行有效。

在$/conf/hive-log4j.properties檔案中找到hive.root.logger屬性,將其修改為 hive.root.logger=debug,console,這種方式修改對所有的使用者有效。

hive-log4j.properties說明

系統日誌儲存: 在hive/conf/hive-log4j.properties檔案中記錄了hive日誌的儲存情況,

預設的儲存情況:

hive.root.logger=warn,d***

hive.log.dir= /tmp/hivelog # 預設的儲存位置

hive.log.file=hive.log # 預設的檔名

sql 支援資料庫的事務、索引以及更新,hql不支援資料庫的事務、更新,雖然hive支援建立索引,但是它還不能提公升資料的查詢速度。

sql資料儲存本地檔案系統,hql儲存在hdfs

sql可擴充套件性低,hql可擴充套件性高

sql延時低,hql延時高

sql資料規模小,hql資料規模大

未被external修飾的是內部表(managed table),被external修飾的為外部表(external table);

內部表資料由hive自身管理,外部表資料由hdfs管理;

內部表資料儲存的位置是hive.metastore.warehouse.dir(預設:/user/hive/warehouse),外部表資料的儲存位置由自己制定;

刪除內部表會直接刪除元資料(metadata)及儲存資料;刪除外部表僅僅會刪除元資料,hdfs上的檔案並不會被刪除;

對內部表的修改會將修改直接同步給元資料,而對外部表的表結構和分割槽進行修改,則需要修復(msck repair table table_name;)

hive會為每個建立的資料庫在hdfs上建立乙個目錄,該資料庫的表會以子目錄形式儲存,表中的資料會以表目錄下的檔案形式儲存。對於default資料庫,預設的預設資料庫沒有自己的目錄,default資料庫下的表預設存放在/user/hive/warehouse目錄下。

textfile

textfile為預設格式,儲存方式為行儲存。資料不做壓縮,磁碟開銷大,資料解析開銷大。

sequencefile

sequencefile是hadoop api提供的一種二進位制檔案支援,其具有使用方便、可分割、可壓縮的特點。 sequencefile支援三種壓縮選擇:none, record, block。 record壓縮率低,一般建議使用block壓縮。

rcfile

一種行列儲存相結合的儲存方式。

orcfile

資料按照行分塊,每個塊按照列儲存,其中每個塊都儲存有乙個索引。hive給出的新格式,屬於rcfile的公升級版,效能有大幅度提公升,而且資料可以壓縮儲存,壓縮快 快速列訪問。

parquet

parquet也是一種行式儲存,同時具有很好的壓縮效能;同時可以減少大量的表掃瞄和反序列化的時間。

hive配置詳解

hive中有許多配置將幫助我們提公升效能,其詳細配置如下 hive.auto.convert.join 預設值為true 是否根據輸入小表的大小,自動將 reduce 端的 common join 轉化為 map join,從而加快大表關聯小表的 join 速度。2 hive.groupby.ske...

hive配置詳解

hive中有許多配置將幫助我們提公升效能,其詳細配置如下 hive.auto.convert.join 預設值為true 是否根據輸入小表的大小,自動將 reduce 端的 common join 轉化為 map join,從而加快大表關聯小表的 join 速度。2 hive.groupby.ske...

Hive詳解(一)Hive是什麼 Hive怎麼用

hadoop通過mapreduce hadoop和mapreduce後續我也會提到 可以將複雜的計算任務分割成多個處理單元然後分散到一群家用的或者伺服器級別的硬體機器上,從而降低成本並提供執行可伸縮性。而隨之出現的問題是使用者如何從現有的資料基礎架構轉移到hadoop平台上。hive相當於一門sql...