hadoop hive組件介紹及常用cli命令


Hive架構圖

 

Hive產生原因

 1 關系型數據庫以產生多年sql成熟

 2 簡化開發降低成本

 3 java成員可編寫udf函數

Hive是什么

  Hive是基於hadoop的一個數據庫工具,使用Hql作為接口,maprduce作為執行層

  Hdfs作為儲存層。設計的目的是讓sql開發人員java技能較弱的人編寫並查詢海量數據

  缺點執行效率低

Hive的訪問

Hive ----odbc/jdbc----hiveserver2

Hive---hive

Compiler 編譯器

Optimizer 優化器

Executor 執行調度

Mapreducetez的區別

TezApache最新開源的支持DAG作業的計算框架,它直接源於MapReduce框架,核心思想是將MapReduce兩個操作進一步拆分,即Map被拆分成InputProcessorSortMergeOutputReduce被拆分成InputShuffleSortMergeProcessorOutput等,這樣,這些分解后的元操作可以任意靈活組合,產生新的操作,這些操作經過一些控制程序組裝后,可形成一個大的DAG作業。總結起來,Tez有以下特點:

1Apache二級開源項目(源代碼今天發布的)

2)運行在YARN之上

3) 適用於DAG(有向圖)應用(同ImpalaDremelDrill一樣,可用於替換Hive/Pig等)

 

Tez可以將多個有依賴的作業轉換為一個作業(這樣只需寫一次HDFS,且中間節點較少),從而大大提升DAG作業的性能。Tez已被Hortonworks用於Hive引擎的優化,經測試,性能提升約100

 

Hive cli說明

命令

描述

Quit

Exit

退出交互式

Reset

重置配置為默認值

Set           

修改特定變量的值

Set -v  

輸出所有hadoophive的配置變量

 

 

 

 

 

 

DDL

創建數據庫

Hive>create database student;

判斷數據庫是否存在

Hive>create database if not EXISTS studnet;

顯示現有數據庫

Hive>show databases;

條件查詢數據庫

Hive>show databases like ‘h.*’

創建指定存放位置

Hive>create database student

Location ‘路徑

創建數據庫時添加注釋信息

Hive>create database student

   >comment ‘注釋

使用數據庫

Hive>use student;

刪除數據庫

Hive>dorp database if exists student;

當數據庫存在表時,先刪除表再刪除數據庫

Hive>drop database if exists student cassade;4

創建表

Hive>use databases;

   >create table if not Exists student(

Name string  comment ‘姓名

Age  int comment ‘年齡

)

Comment ‘創建學生表

Tblproperties(‘creator’=’lhs’,created_at=’data’)

Location ‘表文件地址

創建表,復制表結構

Create table if not exists student2

Like Student.student

顯示數據庫中的表

 Hive>use student;

Hive>show tables;

顯示表擴展信息

Hive>describe extended Student.student;

指定顯示某個字段信息

Hive>descrbe student.student.name;

外部表

刪除表不刪除數據

Hive>create external teble if not exists student(

Name string,

Age int

)

Row format delimited fields terminated by ‘,’//以什么規則拆分

Location ‘路徑

修改表名

Alter table student rename to student1;

修改列

Alter table student change column name name1

String

Comment ‘name修改為name1

After severity

增加列

ALTER TABLE log_messages ADD COLUMNS (  

 app_name   STRING COMMENT 'Application name',  

 session_id LONG   COMMENT 'The current session id');

刪除替換列

ALTER TABLE log_messages REPLACE COLUMNS (  

 hours_mins_secs INT    COMMENT 'hour, minute, seconds from timestamp',  

 severity        STRING COMMENT 'The message severity'  

 message         STRING COMMENT 'The rest of the message');  

 

 

DML

 

從本地文件加載到表

1 hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

OVERWRITE表示覆蓋表中數據,如果沒有使用OVERWRITE將把數據追加到表中原有數據后面

載入文件中的內容必須按照正確地分隔符分割列,load data並不會進行數據驗證

1 hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');2 hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');

上面給兩條語句將數據載入到不同的分區

1 hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

上面的命令從HDFS中加載文件。從HDFS中加載文件將移動文件

 

SQL(結構化查詢語言)用於查詢數據

查詢

1 hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

invites表的2008-08-15分區中查詢出foo字段

1 hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

查詢invites表的2008-08-15分區的所有字段內容並將查詢結果導入到hdfs/tmp/hdfs_out文件中

1 hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

將查詢結果保存到本地文件

 

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;  

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;

  hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;   hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15';  

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;   

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

 

一些查詢示例

GROUP BY使用

1 hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;2 hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

(上面的兩條語句是等價的)

JOIN

1 hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

join使用時要注意方式的選擇({LEFT|RIGHT|FULL} [OUTER] JOIN)及優化,下面是一些參考

http://yugouai.iteye.com/blog/1849395

http://www.open-open.com/lib/view/open1341214750402.html

多表插入(MULTITABLE INSERT

1   FROM src2   

INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100

INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200

INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

上面的語句含義是從src表中查詢出各表需要的數據插入到不同的表中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM