溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

hive基礎(chǔ)操作有哪些

發(fā)布時(shí)間:2021-12-10 09:28:39 來源:億速云 閱讀:128 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下hive基礎(chǔ)操作有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

??Hive支持常見的SQL語句, 除此之外它還有其獨(dú)特的部分. 常見SQL語句與關(guān)系型數(shù)據(jù)庫(例如MySQL)中的語法一致, 這里就不再做詳細(xì)說明. 我們主要來看Hive中不一樣的部分.

??Hive的所有操作可以去Hive官網(wǎng)查看, 點(diǎn)擊此處LanguageManual

??Hive其實(shí)并不難, 對(duì)于有寫過SQL語句的人來說會(huì)更簡(jiǎn)單. 在學(xué)習(xí)Hive時(shí), 建議大家邊學(xué)邊敲, 多做聯(lián)系.

準(zhǔn)備工作

??既然要使用Hive就要有Hive的環(huán)境, 可以根據(jù)這篇博客來安裝Hive以及與Hive相關(guān)的環(huán)境(Hadoop, Yarn)大數(shù)據(jù)生態(tài)圈搭建

??這里我使用的是基于Mysql的遠(yuǎn)程模式來操作Hive.

操作流程

創(chuàng)建第一個(gè)表格

??連接進(jìn)入Hive shell 之后, 先建一個(gè)新的數(shù)據(jù)庫, 之后的大部分操作我們都在這個(gè)數(shù)據(jù)庫中來練習(xí).

創(chuàng)建:

create database hive_test;

使用該數(shù)據(jù)庫:

use hive_test;

??然后, 創(chuàng)建第一個(gè)表gfstbl, 也可使用數(shù)據(jù)庫.表的格式(例如hive_test.gfstbl).

CREATE TABLE gfstbl(

  id INT,

  name STRING,

  age INT,

  gfs ARRAY<STRING>,

  address MAP<STRING,STRING>,

  info STRUCT<country:String,province:String,city:String>

)

ROW FORMAT DELIMITED  

FIELDS TERMINATED BY ' ' 

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':' 

LINES TERMINATED BY '\n';

??解釋說明:

create語句, ()中為字段之間用逗號(hào)分隔, 字段名稱與類型之間用空格隔開. 這里字段的數(shù)據(jù)類型有整型, 字符串, 數(shù)組, 鍵值對(duì)以及結(jié)構(gòu)體.

Hive支持的數(shù)據(jù)類型:

數(shù)據(jù)類型 注釋

tinyint 短整型, 范圍:-128~127

smallint 小整型, -32768~32767

int 整型, -232~232-1

bigint 大整型, 就很大

float 單精度浮點(diǎn)數(shù)

double 雙精度浮點(diǎn)數(shù)

decimal 精度38位十進(jìn)制數(shù)

date 日期

timestamp 時(shí)間戳

char 字符

string 字符串

varchar 可變長度字符串

array 數(shù)組類型

map 鍵值對(duì)類型

structs 結(jié)構(gòu)化類型

ROW FORMAT DELIMITED : 行格式分隔

FIELDS TERMINATED BY ’ ’ : 字段之間使用空格分隔

COLLECTION ITEMS TERMINATED BY ‘,’ : 集合(就是這的數(shù)據(jù))使用逗號(hào)分隔

MAP KEYS TERMINATED BY ‘:’ : 鍵值對(duì)使用冒號(hào)分隔

LINES TERMINATED BY ‘\n’ : 記錄之間使用換行符分隔

; : 每一條SQL語句結(jié)尾都需要以分號(hào)結(jié)束

除此之外, 如果去掉分號(hào), 加上:LOCATION “/test”; , 就可設(shè)置源數(shù)據(jù)在HDFS中存放的位置, 若不設(shè)置默認(rèn)就在Hive的工作目錄區(qū).

??創(chuàng)建表的SQL語句公式如下, 我們會(huì)根據(jù)Hive表的類型將這一公式分開操作.

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)

  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]

  [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]

  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]

     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)

     [STORED AS DIRECTORIES]

  [

   [ROW FORMAT row_format] 

   [STORED AS file_format]

     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)

  ]

  [LOCATION hdfs_path]

  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)

  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

  LIKE existing_table_or_view_name

  [LOCATION hdfs_path];

data_type

  : primitive_type

  | array_type

  | map_type

  | struct_type

  | union_type  -- (Note: Available in Hive 0.7.0 and later)

primitive_type

  : TINYINT

  | SMALLINT

  | INT

  | BIGINT

  | BOOLEAN

  | FLOAT

  | DOUBLE

  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)

  | STRING

  | BINARY      -- (Note: Available in Hive 0.8.0 and later)

  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)

  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)

  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)

  | DATE        -- (Note: Available in Hive 0.12.0 and later)

  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)

  | CHAR        -- (Note: Available in Hive 0.13.0 and later)

array_type

  : ARRAY < data_type >

map_type

  : MAP < primitive_type, data_type >

struct_type

  : STRUCT < col_name : data_type [COMMENT col_comment], ...>

union_type

   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)

row_format

  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)

  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

file_format:

  : SEQUENCEFILE

  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)

  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)

  | ORC         -- (Note: Available in Hive 0.11.0 and later)

  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)

  | AVRO        -- (Note: Available in Hive 0.14.0 and later)

  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)

  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

constraint_specification:

  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]

    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE

查看第一個(gè)表的結(jié)構(gòu)

??查看表結(jié)構(gòu)的公式:

DESCRIBE [EXTENDED|FORMATTED] table_name

EXTENDED 極簡(jiǎn)的方式顯示

FORMATTED 格式化方式來顯示

??只查看表字段及類型, 結(jié)果如下圖

DESC gfstbl;

DESCRIBE gfstbl;

??極簡(jiǎn)方式查看表結(jié)構(gòu), 結(jié)果如下圖

DESCRIBE EXTENDED gfstbl;

??格式化方式查看表, 結(jié)果如下圖

DESCRIBE FORMATTED gfstbl;

表中加載數(shù)據(jù)

待加載數(shù)據(jù)

??數(shù)據(jù)內(nèi)容如下:

001 zhangsan 19 Girl1,Girl2,Girl3 Girl1:qingdao,Girl2:jinan,Girl3:nanjing zhongguo,shandong,weifang

002 lisi 20 GirlA,GirlB GirlA:American,GirlB:長沙 zhongguo,shandong,qingdao

??將這兩行數(shù)據(jù)復(fù)制到gfs.txt文件中

vim /root/gfs.txt

然后復(fù)制粘貼數(shù)據(jù)

導(dǎo)入數(shù)據(jù)到Hive表中

load data local inpath '/root/gfs.txt' into table hive_test.gfstbl;

??需要注意: load方式插入數(shù)據(jù)不會(huì)啟動(dòng)MR任務(wù), load的實(shí)質(zhì)是將文件上傳到hdfs目錄中.

查看數(shù)據(jù)的三種方式

使用select語句

select * from gfstbl;

2. 通過hdfs集群操作

hdfs dfs -ls /user/hive_meta/warehouse/hive_test.db/gfstbl

hdfs dfs -cat /user/hive_meta/warehouse/hive_test.db/gfstbl/*

3. 通過webUI頁面

??進(jìn)圖webUI頁面, 找到文件對(duì)應(yīng)位置

查看數(shù)組,鍵值對(duì),結(jié)構(gòu)體數(shù)據(jù)的某個(gè)值

??對(duì)于 數(shù)組 使用 : 列名[索引] 的形式查看(索引下標(biāo)從0開始)

??對(duì)于鍵值對(duì)使用 : 列名[“Key”]

??對(duì)于結(jié)構(gòu)體使用 : 列名.屬性

select gfs[0],address["Girl2"],info.city from gfstbl;

刪除表的方式

drop table gfstbl2;

??此處需要注意, 如果通過hdfs操作刪除表所在的目錄, hive中表還會(huì)存在. 原因在于mysql的hive_meta數(shù)據(jù)庫中還存有該表的元數(shù)據(jù)信息.

知識(shí)積累

Hive中創(chuàng)建表的三種方式

通過編寫完整的CREATE語句創(chuàng)建, 如上文中我們創(chuàng)建gfstbl時(shí)的語句:

CREATE TABLE gfstbl(

  id INT,

  name STRING,

  age INT,

  gfs ARRAY<STRING>,

  address MAP<STRING,STRING>,

  info STRUCT<country:String,province:String,city:String>

)

ROW FORMAT DELIMITED  

FIELDS TERMINATED BY ' ' 

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':' 

LINES TERMINATED BY '\n';

通過使用CREATE和LIKE關(guān)鍵詞創(chuàng)建一個(gè)與原來表結(jié)構(gòu)完全相同, 但沒有數(shù)據(jù)的新表:

create table gfstbl1 like gfstbl;

通過使用CREATE, AS和SELECT關(guān)鍵詞創(chuàng)建一個(gè)不僅表結(jié)構(gòu)一樣而且數(shù)據(jù)也一樣的新表:

create table gfstbl2 AS SELECT id,name,gfs,address,info from gfstbl;

??注意, 由于這種方式插入數(shù)據(jù)使用的是insert來插入數(shù)據(jù), 因此會(huì)啟動(dòng)MR任務(wù).

Hive表中插入數(shù)據(jù)的四種方式

insert 新數(shù)據(jù), 最簡(jiǎn)單, 最基本也是最少用的方式, 直接寫insert語句.

insert into table(col...) values(val...)

1

load方式, 最常用也是效率最高的方式

??LOAD DATA命令,可分為LOAD DATA LOCAL INPATH和LOAD DATA INPATH。兩者的區(qū)別在于LOCAL導(dǎo)入的是本地文件而不加LOCAL的導(dǎo)入的是HDFS文件

LOAD DATA INPATH '/a.txt' INTO TABLE user

1

查詢(select)其他表數(shù)據(jù) insert 到新表中

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

FROM from_statement

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1

??習(xí)慣上使用第二種語法, 即將from語句提前, 減少SQL代碼的冗余.

from user

insert into user_count 

select count(*)

insert into user_copy 

select *;

直接使用hdfs命令將符合格式的文件放到該表在HDFS對(duì)應(yīng)的目錄下

Hive中表的類型

內(nèi)部表

??與數(shù)據(jù)庫中的Table在概念上類似, 每一個(gè)內(nèi)部表在Hive中都有一個(gè)相應(yīng)的目錄存數(shù)據(jù), 所有表的數(shù)據(jù)(不包括External Table)都保存在這個(gè)目錄中. 如上文中創(chuàng)建的gfstbl表.

??刪除表時(shí),元數(shù)據(jù)與數(shù)據(jù)都會(huì)刪除.

臨時(shí)表

??臨時(shí)表的生命周期是一次會(huì)話, 當(dāng)本次會(huì)話結(jié)束時(shí), 臨時(shí)表會(huì)自動(dòng)刪除.

外部表

??刪除表時(shí), 元數(shù)據(jù)會(huì)被刪除, 但數(shù)據(jù)(存放在HDFS)不會(huì)被刪除.

分區(qū)表

??將一批數(shù)據(jù)分成多個(gè)目錄來存儲(chǔ), 從而防止暴力掃描. 分區(qū)表分為靜態(tài)分區(qū)表和動(dòng)態(tài)分區(qū)表.

分桶表

??分桶表是對(duì)列值取哈希值的方式,將不同數(shù)據(jù)放到不同文件中存儲(chǔ). 由列的哈希值除以桶的個(gè)數(shù)來決定每條數(shù)據(jù)劃分在哪個(gè)桶中, 對(duì)于hive中每一個(gè)表、分區(qū)都可進(jìn)一步分桶.

以上是“hive基礎(chǔ)操作有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI