大數據(十九) -- Hive操作--基礎

前言

  Hive支持常見的SQL語句, 除此之外它還有其獨特的部分. 常見SQL語句與關係型數據庫(例如MySQL)中的語法一致, 這裏就不再做詳細說明. 我們主要來看Hive中不一樣的部分.

  Hive的所有操作可以去Hive官網查看, 點擊此處LanguageManual

  Hive其實並不難, 對於有寫過SQL語句的人來說會更簡單. 在學習Hive時, 建議大家邊學邊敲, 多做聯繫.

準備工作

  既然要使用Hive就要有Hive的環境, 可以根據這篇博客來安裝Hive以及與Hive相關的環境(Hadoop, Yarn)大數據生態圈搭建

  這裏我使用的是基於Mysql的遠程模式來操作Hive.

操作流程

創建第一個表格

  連接進入Hive shell 之後, 先建一個新的數據庫, 之後的大部分操作我們都在這個數據庫中來練習.

創建:
create database hive_test;

使用該數據庫:
use 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語句, ()中爲字段之間用逗號分隔, 字段名稱與類型之間用空格隔開. 這裏字段的數據類型有整型, 字符串, 數組, 鍵值對以及結構體.
    Hive支持的數據類型:
數據類型 註釋
tinyint 短整型, 範圍:-128~127
smallint 小整型, -32768~32767
int 整型, -232~232-1
bigint 大整型, 就很大
float 單精度浮點數
double 雙精度浮點數
decimal 精度38位十進制數
date 日期
timestamp 時間戳
char 字符
string 字符串
varchar 可變長度字符串
array 數組類型
map 鍵值對類型
structs 結構化類型
  • ROW FORMAT DELIMITED : 行格式分隔
  • FIELDS TERMINATED BY ’ ’ : 字段之間使用空格分隔
  • COLLECTION ITEMS TERMINATED BY ‘,’ : 集合(就是這的數據)使用逗號分隔
  • MAP KEYS TERMINATED BY ‘:’ : 鍵值對使用冒號分隔
  • LINES TERMINATED BY ‘\n’ : 記錄之間使用換行符分隔
  • ; : 每一條SQL語句結尾都需要以分號結束
  • 除此之外, 如果去掉分號, 加上:LOCATION “/test”; , 就可設置源數據在HDFS中存放的位置, 若不設置默認就在Hive的工作目錄區.

  創建表的SQL語句公式如下, 我們會根據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

查看第一個表的結構

  查看錶結構的公式:

DESCRIBE [EXTENDED|FORMATTED] table_name
  • EXTENDED 極簡的方式顯示
  • FORMATTED 格式化方式來顯示

  只查看錶字段及類型, 結果如下圖

DESC gfstbl;DESCRIBE gfstbl;

在這裏插入圖片描述

  極簡方式查看錶結構, 結果如下圖

DESCRIBE EXTENDED gfstbl;

在這裏插入圖片描述

  格式化方式查看錶, 結果如下圖

DESCRIBE FORMATTED gfstbl;

在這裏插入圖片描述

表中加載數據

待加載數據

  數據內容如下:

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

  將這兩行數據複製到gfs.txt文件中

vim /root/gfs.txt
然後複製粘貼數據

導入數據到Hive表中

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

  需要注意: load方式插入數據不會啓動MR任務, load的實質是將文件上傳到hdfs目錄中.

查看數據的三種方式

  1. 使用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頁面
  進圖webUI頁面, 找到文件對應位置
在這裏插入圖片描述

查看數組,鍵值對,結構體數據的某個值

  對於 數組 使用 : 列名[索引] 的形式查看(索引下標從0開始)
  對於鍵值對使用 : 列名[“Key”]
  對於結構體使用 : 列名.屬性

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

在這裏插入圖片描述

刪除表的方式

drop table gfstbl2;

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

知識積累

Hive中創建表的三種方式

  1. 通過編寫完整的CREATE語句創建, 如上文中我們創建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';
  1. 通過使用CREATE和LIKE關鍵詞創建一個與原來表結構完全相同, 但沒有數據的新表:
create table gfstbl1 like gfstbl;
  1. 通過使用CREATE, AS和SELECT關鍵詞創建一個不僅表結構一樣而且數據也一樣的新表:
create table gfstbl2 AS SELECT id,name,gfs,address,info from gfstbl;

  注意, 由於這種方式插入數據使用的是insert來插入數據, 因此會啓動MR任務.

Hive表中插入數據的四種方式

  1. insert 新數據, 最簡單, 最基本也是最少用的方式, 直接寫insert語句.
insert into table(col...) values(val...)
  1. load方式, 最常用也是效率最高的方式
      LOAD DATA命令,可分爲LOAD DATA LOCAL INPATH和LOAD DATA INPATH。兩者的區別在於LOCAL導入的是本地文件而不加LOCAL的導入的是HDFS文件
LOAD DATA INPATH '/a.txt' INTO TABLE user
  1. 查詢(select)其他表數據 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

  習慣上使用第二種語法, 即將from語句提前, 減少SQL代碼的冗餘.

from user
insert into user_count 
	select count(*)
insert into user_copy 
	select *;
  1. 直接使用hdfs命令將符合格式的文件放到該表在HDFS對應的目錄下

Hive中表的類型

  1. 內部表
      與數據庫中的Table在概念上類似, 每一個內部表在Hive中都有一個相應的目錄存數據, 所有表的數據(不包括External Table)都保存在這個目錄中.

  刪除表時,元數據與數據都會刪除.

  1. 臨時表
      臨時表的生命週期是一次會話, 當本次會話結束時, 臨時表會自動刪除.

  2. 外部表
      刪除表時, 元數據會被刪除, 但數據(存放在HDFS)不會被刪除.

  3. 分區表
      將一批數據分成多個目錄來存儲, 從而防止暴力掃描. 分區表分爲靜態分區表和動態分區表.

  4. 分桶表
      分桶表是對列值取哈希值的方式,將不同數據放到不同文件中存儲. 由列的哈希值除以桶的個數來決定每條數據劃分在哪個桶中, 對於hive中每一個表、分區都可進一步分桶.

  對這五種表的學習, 會在後續博客中再來講解.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章