HIVE的資料模型

2021-09-22 13:18:02 字數 4934 閱讀 7928

hive 中所有的資料都儲存在 hdfs 中,hive 中包含以下資料模型:

示例

# 建立表

level string,

leader string,

dep string,

ips array)

row format delimited

fields terminated by ' '

collection items terminated by ',';

# 自定義檔案和記錄格式

# 使用create table建立表,最後使用儲存成sequence格式[預設是text格式]

stored as sequencefile

# 資料庫授權

grant create on database dbname to user hadoop;

#匯入資料

# hive是讀時檢查,上傳的資料檔案一定要符合格式,mysql是寫時檢查

#hdfs中資料的匯入,本質是就是檔案的移動

#本地匯入,資料copy到hdfs中

load data local inpath '/home/hdfs/online_state1' overwrite into table online_state partition (end_dt='99991231');

# 檢視表結構

describe extended bgops;

describe bgops;

# 修改列名

## 這個命令可以修改表的列名,資料型別,列注釋和列所在的位置順序,first將列放在第一列,after col_name將列放在col_name後面一列

# 修改表結構

# 增加表的列欄位(預設增加到最後一列,可以使用change column 來調整位置)

# 增加表的列欄位(預設增加到最後一列,可以使用change column 來調整位置)

# 匯出表查詢結果(會將結果匯出到testoutput目錄下)

insert overwrite local directory './testoutput'

row format delimited fields terminated by "\t"

external table 外部表需要指定資料讀取的目錄,而內部表建立的時候存放資料到預設路徑,內部表將資料和元資料全部刪除,外部表只刪除元資料,資料檔案不會刪除。外部表和內部表在元資料的組織上是相同的。外部表載入資料和建立表同時完成,並不會移動到資料倉儲目錄中。

外部表和內部表的應用場景:

其實外部表在日常開發中我們用的最多,比如原始日誌檔案或同時被多個部門同時操作的資料集,需要使用外部表,而且如果不小心將meta data刪除了,hdfs上的資料還在,可以恢復,增加了資料的安全性。

## 外部表的建立

create external table psn

(id int,

name string,

likes array,

address map)

row format delimited

fields terminated by ','

collection items terminated by '-'

map keys terminated by ':'

location '/usr/';

分割槽表通常分為靜態分割槽表和動態分割槽表,前者需要匯入資料時靜態指定分割槽,後者可以直接根據匯入資料進行分割槽。分割槽的好處是可以讓資料按照區域進行分類,避免了查詢時的全表掃瞄。

# 建立分割槽表

create table psn

(id int,

name string,

likes array,

address map)

partitioned by (age int,gender string)

row format delimited

fields terminated by ','

collection items terminated by '-'

map keys terminated by ':';

# 載入資料

load data local inpath '/root/data/data' into table psn partition(age=20,gender='man');

# 增加分割槽(其實就建立分割槽目錄,裡面沒資料)

# 增加分割槽列的值的時候,如果是多分割槽,必須要包含所有的分割槽列

alter table psn add partition(age=20,gender='women');

# 刪除分割槽,可以指定根據一部分的分割槽條件刪除

alter table psn drop partition(gender='man');

# 修復分割槽

msck repair table psn;

# 靜態分割槽的使用

insert overwrite table partition_test partition(stat_date='20110527',province='liaoning') select member_id,name from partition_test_input;

動態分割槽的啟用

# 使用動態分割槽要先設定hive.exec.dynamic.partition引數值為true,預設值為false,即不允許使用:

set hive.exec.dynamic.partition=true;

# 其次分割槽模型必須設定為非嚴格模式(預設strict)

set hive.exec.dynamic.partition.mode=nostrict;

#在strict模式下,動態分割槽的使用必須在至少乙個靜態分割槽確認的情況下,其他分割槽可以是動態;

# 即不允許分割槽列全部是動態的,這是為了防止使用者有可能原意是只在子分區內進行動態建分割槽,但是由於疏忽忘記為主分割槽列指定值了,這將導致乙個dml語句在短時間內建立大量的新的分割槽(對應大量新的資料夾),對系統效能帶來影響。

# 這一理念就是hadoop的防止好人做錯事

#插入資料 靜態分割槽需要指定分割槽

# 動態分割槽的使用方法很簡單,假設我想向stat_date='20110728'這個分割槽下面插入資料,至於province插入到哪個子分割槽下面讓資料庫自己來判斷,那可以這樣寫:

insert overwrite table partition_test partition(stat_date='20110728',province)

select member_id,name,province from partition_test_input where stat_date='20110728';

再介紹3個引數:

hive.exec.max.dynamic.partitions.pernode(預設值100):每乙個mapreduce job允許建立的分割槽的最大數量,如果超過了這個數量就會報錯

hive.exec.max.dynamic.partitions(預設值1000):乙個dml語句允許建立的所有分割槽的最大數量

hive.exec.max.created.files(預設值100000):所有的mapreduce job允許建立的檔案的最大數量

將同乙個目錄下的乙個檔案拆分成多個檔案,每個檔案包含一部分資料,方便獲取值,提高檢索效率

實現方式:

獲取表的某乙個列或者部分列,獲取hashcode,按照hashcode值/buckets的個數,來決定每條資料放置到哪乙個檔案中。

桶中的資料可以根據乙個或多個列另外進行排序。由於這樣對每個桶的連線變成了高效的歸併排序(merge-sort), 因此可以進一步提公升map端連線的效率。

# 開啟支援分桶

set hive.enforce.bucketing=true;

# 建立原始資料表:

create table psn(

id int, name string, age int

)row format delimited fields terminated by ',';

# 排序的桶

create table bucketed_users (

id int, name string

) clustered by (id) sorted by (id asc) into 4 buckets;

# 建立分桶表:

create table psn_bucket(

id int ,name string,age int

) clustered by(age) into 4 buckets

row format delimited fields terminated by ',';

# 向分桶表中新增資料:

insert into psn_bucket select * from psn;

# 對桶中的資料進行取樣

select * from bucketed_users tablesample(bucket 1 out of 4 on id);

應用場景:

1、資料抽樣

tablesample(bucket x out of y)

分桶表可以在分割槽表的基礎之上建立,也可以只建立分桶表。

分割槽表和分桶表的區別

1.hive 資料表可以根據某些字段進行分割槽操作,細化資料管理,可以讓部分查詢更快。

2.表和分割槽也可以進一步被劃分為 buckets,分桶表的原理和 mapreduce 程式設計中的hashpartitioner 的原理類似。

3.分割槽和分桶都是細化資料管理,由於 hive 是讀模式,所以對新增進分割槽的資料不做模式校驗,分桶表中的資料是按照某些分桶字段進行 hash 雜湊形成的多個檔案,所以資料的準確性也高很多。

Hive 資料模型

hive 資料模型 hive 資料表有五種型別 內部表,外部表,分割槽表,桶表,檢視表,預設以 tab 分隔 mysql oracle 表預設以逗號分隔,因此,要想匯入 mysql oracle 資料,需要設定分隔符,在建表語句後加 row format delimited fields termi...

Hive筆記 Hive資料模型

hive資料模型 hive中的資料模型主要分為 除了原始列型別 整數integers,浮點數floating point numbers,泛型字串generic strings,日期和布林值dates and booleans 之外,hive還支援陣列 array 和對映 map 此外,使用者可以基...

Hive資料模型基礎

hive將為每個資料庫建立乙個目錄。hdfs上建立乙個與之對應的目錄 該資料庫中的表將儲存在資料庫目錄的子目錄中。例外情況是預設資料庫中的表,它沒有自己的目錄。2 直接輸入 一.資料庫的基本操作 1.預設路徑 資料庫目錄是在屬性hive.metastore.warehouse.dir指定的頂級目錄下...