從0開始學大數據-Hive基礎篇

Hive起源於Facebook,是基於 Hadoop HDFS 分佈式文件系統的分佈式 數據倉庫 架構。它爲數據倉庫的管理提供了許多功能:數據ETL(抽取、轉換和加載)工具、數據存儲管理和大型數據集的查詢和分析能力。同時Hive還定義了類SQL的語言(HiveQL)。容許用戶進行和SQL類似的操做,它能夠將結構化的數據文件映射爲一張數據庫表,並提供簡單的SQL查詢功能。還容許開發人員方便的使用Mapper和Reducer操做,能夠將SQL語句轉換爲MapReduce任務運行。mysql

Hive的特色

Hive做爲Hadoop之上的數據倉庫處理工具,它全部的數據都是存儲在Hadoop兼容的文件系統中。Hive在加載數據過程當中不會對數據進行任何的修改,只是將數據移動到HDFS中Hive設定的目錄下。所以,Hive不支持對數據的修改和添加,全部的數據都是在加載的時候肯定的。sql

  • Hive 最大的特色是經過類 SQL 來分析大數據,而避免了寫 MapReduce 程序來分析數據,這樣使得分析數據更容易。數據庫

  • 數據是存儲在 HDFS 上的,Hive 自己並不提供數據的存儲功能架構

  • Hive 是將數據映射成數據庫和一張張的表,庫和表的元數據信息通常存在關係型數據庫上(好比 MySQL)。app

  • 數據存儲方面:它可以存儲很大的數據集,而且對數據完整性、格式要求並不嚴格。分佈式

  • 數據處理方面:不適用於實時計算和響應,使用於離線分析。函數

Hive體系架構

  • 用戶接口:包括CLI,JDBC/ODBC,WebUI等方式。
  • 元數據Metastore:一般存儲在關係數據庫如mysql,derby中。元數據包括:表名,表所屬的數據庫,表的列/分區字段,表的屬性(是否爲外部表等),表的數據所在目錄等信息。
  • Driver:包括解釋器、編譯器、優化器、執行器。HiveQL查詢語句從詞法分析。語法分析、編譯、優化以及查詢計劃生成。生成的查詢計劃存儲在HDFS中,並在後面的MapReduce中進行調用執行。
    • 解析器:將SQL轉換成抽象的語法樹AST。
    • 編譯器:將抽象語法樹AST編譯生成邏輯執行計劃。
    • 優化器:將邏輯執行計劃進行優化。
    • 執行器:把邏輯執行計劃轉換成能夠運行的物理執行計劃。
  • Hadoop:使用HDFS進行存儲,利用MapReduce進行計算。

Hive運行機制

  1. 編寫HiveQL,並提交;
  2. Hive解析查詢語句,並生成查詢計劃;
  3. Hive將查詢計劃轉化爲MR做業;
  4. 運行MR做業,獲得最終結果。

Hive與關係數據庫的區別

Hive中的基本數據類型

基本數據類型

Hive支持關係數據庫中大多數據基本數據類型,同時還支持三種複雜類型。工具

複雜數據類型

示例:oop

Hive表

建立表

-- 直接建表法
create table t_page_view (  
  page_id bigint comment '頁面ID',  
  page_name string comment '頁面名稱',  
  page_url string comment '頁面URL'  
)  
comment '頁面視圖'
partitioned by (ds string comment '當前時間,用於分區字段')   
stored as parquet
location '/user/hive/warehouse/t_page_view';

-- 查詢建表法
create table t_page_view2  as select * from t_page_view;

-- like建表法(克隆表)
create table t_page_view3 like t_page_view;
複製代碼

Hive表類型

內部表

Hive中默認建立的是內部表,內部表的數據由Hive來管理。在 drop表的時候,表的數據和元數據都會被刪除。性能

CREATE TABLE pokes (
  foo INT,
  bar STRING
);
複製代碼

外部表

外部表的數據不禁Hive管理。Hive能夠建立外部表和 HDFS、HBase 和 Elasticsearch 等進行整合。drop外部表時,只會刪除元數據,不會刪除真實數據。外部表關鍵字EXTERNAL

CREATE EXTERNAL TABLE IF NOT EXISTS tb_station (
  station string,
  lon string,
  lat string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/test/coordinate/';
複製代碼

內部表與外部錶轉換

-- 內部錶轉外部表
alter table tableA set TBLPROPERTIES('EXTERNAL'='true');
-- 外部錶轉內部表
alter table tableA set TBLPROPERTIES('EXTERNAL'='false');
複製代碼

分區表

Hive表的數據是存儲在HFDS中對應的目錄中,普通表的數據直接存儲在這個目錄下,而分區表存儲時,會再劃分子目錄來存儲,一個分區對應一個子目錄。主要做用是來優化查詢性能。在Hive表查詢的時候,若是指定了分區字段做爲篩選條件,那麼只須要到對應的分區目錄下去檢索數據便可,減小了處理的數據量,從而有效的提升了效率。在對分區表進行查詢時,儘可能使用分區字段做爲篩選條件

CREATE TABLE invites (
  foo INT,
  bar STRING
)
PARTITIONED BY (ds STRING);
複製代碼

桶表

分桶是將數據分解成更容易管理的若干部分的技術,桶表示對數據源數據文件自己來拆分數據。桶是更爲細粒度的數據範圍劃分。Hive採用對列進行哈希,而後對桶的個數取模的方式決定該條記錄存放在哪一個桶當中。

建立桶表時,須要指定桶的個數,分桶的依據字段,Hive就能夠自動將數據分桶存儲。

查詢時,只須要遍歷一個桶裏的數據,或者遍歷部分桶,這樣就提升了查詢效率。

示例:

CREATE TABLE ods.tb_ad_action_d (
  op_time STRING,
  user_id STRING,
  task_id STRING,
  event_name STRING
)
CLUSTERED BY (user_id)
SORTED BY(task_id)
INTO 10 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
複製代碼
  • CLUSTERED BY:是指根據user_id的值進行哈希後模除分桶個數,根據獲得的結果,肯定這行數據分入哪一個桶中。
  • SORTED BY:指定桶中的數據以哪一個字段進行排序,排序的好處是,在 join 操做時可以得到很高的效率。
  • INTO 10 BUCKETS:指定一共分多少個桶。

經常使用HiveQL整理

Database

-- 建立database
create database IF NOT EXISTS ods;

USE database_name;

USE DEFAULT;

-- 刪除database
drop database if exists ods;
複製代碼

Table

-- 建立內部表(默認)
create table trade_detail(
    id bigint, 
    account string, 
    income double, 
    expenses double, 
    time string) 
row format delimited 
fields terminated by '\t';

-- 建立分區表
create table td_part(
    id bigint, 
    account string, 
    income double, 
    expenses double, 
    time string) 
partitioned by (logdate string) 
row format delimited 
fields terminated by '\t';

-- 建立外部表
create external table td_ext(
    id bigint, 
    account string, 
    income double, 
    expenses double, 
    time string) 
row format delimited 
fields terminated by '\t' 
location '/data/td_ext';

-- 建立外部分區表
create external table td_part_ext(
    id bigint, 
    account string, 
    income double, 
    expenses double, 
    time string) 
partitioned by (logdate string) 
stored as parquet tblproperties("parquet.compress"="SNAPPY")
location '/data/td_part_ext';

drop table if exists td_part_ext;
複製代碼

Alter

-- 修改代表
ALTER TABLE page_view RENAME to page_view_new;

-- 修改字段
ALTER TABLE page_view CHANGE ip ip_address string AFTER refererurl;

-- 添加字段
ALTER TABLE page_view ADD COLUMNS (name string comment 'view name');

-- 添加分區
ALTER TABLE page_view ADD IF NOT EXISTS PARTITION (dt='20190705') LOCATION='/data/page_view/dt=20190705';


-- 修改location
ALTER TABLE page_view PARTITION(dt='20190706') SET LOCATION "/data/page_view/dt=20190706";

-- 修改分隔符
ALTER TABLE page_view SET SERDEPROPERTIES ('field.delim' = ',');

-- 刪除分區
ALTER TABLE page_view DROP PARTITION (dt='2008-08-08', country='us');
複製代碼

Show

-- 查看建立表語句
show create table td_part;

-- 查看錶分區
show partitions td_part;
複製代碼

修復分區

-- 修復分區
msck repair table page_view;
複製代碼

數據導入

-- 將本地文件導入到hive
load data local inpath '/home/hadoop/student' overwrite into table student partition(state='Sichuan', city='Chengdu');

-- 將hdfs上文件導入到hive
load data inpath '/user/hadoop/add.txt' into table student partition(state='Sichuan', city='Chengdu');

-- 從別的表中查詢出相應的數據並導入到hive表中
insert into table test partition(age='25') select id ,name from wyp where age='25';

-- 在建立表的時候經過從別的表中查詢出相應的記錄並插入到所建立的表中
create table tmp as select * from student where age>'18';
複製代碼

數據導出

-- 導出到本地文件系統
insert overwrite local directory '/home/hadoop/student' select * from student;

-- 導出到hdfs
insert overwrite directory '/user/hadoop/student' select * from student;

-- 將查詢結果插入到表中(追加)
insert into table student_new select id,name from student where age='25';

-- 將查詢結果插入到表中(覆蓋)
insert into table student_new select id,name from student where age='25';
複製代碼

自定義函數

UDF(user-defined functions)

用戶自定義普通函數,用於處理單行數據,並生成單個數據行。用來自定義完成對字段處理的函數。

UDAF(user-defined aggregation functions)

聚合函數,多對一,多行變一行,需和group by聯合使用。

UDTF(user-defined table-generating functions)

表生成函數,一對多,一行變多行。

相關文章
相關標籤/搜索