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 執行調度
Mapreduce和tez的區別
Tez是Apache最新開源的支持DAG作業的計算框架,它直接源於MapReduce框架,核心思想是將Map和Reduce兩個操作進一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,這樣,這些分解后的元操作可以任意靈活組合,產生新的操作,這些操作經過一些控制程序組裝后,可形成一個大的DAG作業。總結起來,Tez有以下特點:
(1)Apache二級開源項目(源代碼今天發布的)
(2)運行在YARN之上
(3) 適用於DAG(有向圖)應用(同Impala、Dremel和Drill一樣,可用於替換Hive/Pig等)
Tez可以將多個有依賴的作業轉換為一個作業(這樣只需寫一次HDFS,且中間節點較少),從而大大提升DAG作業的性能。Tez已被Hortonworks用於Hive引擎的優化,經測試,性能提升約100倍
Hive cli說明
命令 |
描述 |
Quit Exit |
退出交互式 |
Reset |
重置配置為默認值 |
Set |
修改特定變量的值 |
Set -v |
輸出所有hadoop和hive的配置變量 |
|
|
|
|
|
|
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表中查詢出各表需要的數據插入到不同的表中