對每一個在數據挖掘行業工作的人,在工作中都會時刻面對海量的數據,此時 EXCEL 處理數據的時候就會有一定的困難。此時就需要工程師使用 HIVE 語言去操作數據庫。本文從一個初學者的角度來簡要介紹一下 HIVE 和基本的使用場景,作為初學者,在整理的過程中難免會出現錯誤,希望大家多多指教。
HIVE 介紹
(1)hive 是基于 的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供完整的 sql 查詢功能,可以將 sql 語句轉換為 任務進行運行。其優點是學習成本低,可以通過類 SQL 語句快速實現簡單的 統計,不必開發專門的 應用,十分適合數據倉庫的統計分析。
(2)Hive 是建立在 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 開發者的開發自定義的 和 來處理內建的 和 無法完成的復雜的分析工作。
使用 hive 的命令行接口,感覺很像操作關系數據庫,但是 hive 和關系數據庫還是有很大的不同,下面我就比較下 hive 與關系數據庫的區別,具體如下:
Hive 和關系數據庫存儲文件的系統不同,Hive 使用的是 的 HDFS( 的分布式文件系統),關系數據庫則是服務器本地的文件系統;
hive 使用的計算模型是 ,而關系數據庫則是自己設計的計算模型;
關系數據庫都是為實時查詢的業務進行設計的,而 Hive 則是為海量數據做數據挖掘設計的,實時性很差;實時性的區別導致 Hive 的應用場景和關系數據庫有很大的不同;
Hive 很容易擴展自己的存儲能力和計算能力,這個是繼承 的,而關系數據庫在這個方面要比數據庫差很多。
以上都是從宏觀的角度比較 Hive 和關系數據庫的區別,下面介紹一下在實際工作中遇到的一些常用語句和方法。
HIVE 基礎hive 常用命令
假設有數據庫 ,里面有表格
show ; //列出數據庫
desc ; // 展示數據庫 的信息
use ; // 使用某個數據庫 \
set hive.cli.print..db=true; 顯示列頭
set hive.cli.print..db=false; 關閉列頭
show ; // 展示這個數據庫里面的所有表格
show in ; // 展示數據庫 里面的所有表格
show like '*ctr*'; // 模糊查找
show table ; // 獲得表格 的建表語句,其中包括表格的字段,HDFS 的 等信息
desc ; // 展示表格 的字段以及字段類型
desc ; // 詳細描述表格 ,包括表格的結構,所在的 ,owner,,表格的類型 ( Table or Table),存儲信息等
內部表與外部表
hive 的表格分兩種,一種是 (內部表),另一種是 (外部表)。hive 創建表格時,默認創建的是 tablehive 用中間表,這種表會把數據移動到自己的數據倉庫目錄下;另外一種是 ,它關聯的數據不是 hive 維護的,也不在 hive 的數據倉庫內。
創建內部表格和外部表格:
table test(name );
table test(name ); 創建外部表格需要加上;
修改表屬性:
alter table test set (‘’=’TRUE’); 內部表轉外部表
alter table test set (‘’=’FALSE’); 外部表轉內部表
歸納一下Hive中表與外部表的區別:
1. 在導入數據到外部表,數據并沒有移動到自己的數據倉庫目錄下(如果指定了的話),也就是說外部表中的數據并不是由它自己來管理的!而內部表則不一樣;
2. 在刪除內部表的時候,Hive 將會把屬于表的元數據和數據全部刪掉;而刪除外部表的時候,Hive 僅僅刪除外部表的元數據,數據是不會刪除的!換言之hive 用中間表,內部表 DROP 時會刪除 HDFS 上的數據;外部表 DROP 時不會刪除 HDFS 上的數據。
3. 在創建內部表或外部表時加上 的效果是一樣的,只不過表目錄的位置不同而已,加上 用法也一樣,只不過表目錄下會有分區目錄而已,load data local 直接把本地文件系統的數據上傳到 hdfs 上,有 上傳到 指定的位置上,沒有的話上傳到 hive 默認配置的數據倉庫中。
4. 使用場景:內部表:HIVE 中間表,結果表,一般不需要從外部(如本地文件,HDFS 上 load 數據)的情況;外部表:源表,需要定期將外部數據映射到表格中。
創建表格
table test1 like test; 只是復制了表的結構,并沒有復制內容;
table test2 as name from test; 從其他表格查詢,再創建表格;
創建表的語法選項特別多,這里只列出常用的選項。
其他請參見Hive官方文檔:
+DDL#-
舉一個例子來說吧:建立一張表
TABLE (
id INT,
ip ‘訪問者IP’,
(5,1),
(6,5)
) ‘’
BY (day )
ROW
BY ‘,’
AS
‘hdfs://cdh5/tmp//’;
(1)關鍵字 :表示該表為外部表,如果不指定關鍵字,則表示內部表
(2)關鍵字 :為表和列添加注釋
(3)關鍵字 BY:表示該表為分區表,分區字段為day,類型為
(4)關鍵字 ROW :指定表的分隔符,通常后面要與以下關鍵字連用:
BY ‘,’ //指定每行中字段分隔符為逗號
LINES BY ‘\n’ //指定行分隔符
ITEMS BY ‘,’ //指定集合中元素之間的分隔符
MAP KEYS BY ‘:’ //指定數據中 Map 類型的 Key 與 Value 之間的分隔符
(5)關鍵字 AS:指定表在 HDFS 上的文件存儲格式,可選的文件存儲格式有:
//文本,默認值
// 二進制序列文件
//列式存儲格式文件 Hive0.6 以后開始支持
ORC //列式存儲格式文件,比 有更高的壓縮比和讀寫效率,Hive0.11以后開始支持
//列出存儲格式文件,Hive0.13以后開始支持
(6)關鍵詞 :指定表在HDFS上的存儲位置。
注:hive 建表的時候默認的分隔符是’\001’,如果建表的時候沒有指定分隔符,load文件的時候的分隔符是’\001’。如果需要在建表的時候指定分隔符,需要如下操作:
table pokes(foo int,bar )
row by ‘\t’ lines by ‘\n’ as ;
load data local ‘/root/pokes.txt’ into table pokes;
修改表格
alter table add ( ‘上報日期時間’) //為表格增加列
alter table test to test2; //修改表名
alter table test add (day=); //增加分區
alter table test drop (day=); //刪除分區
alter table test (day=) to (day=); //修改分區
load data local ‘///’ into table test; // 從文件加載數據:覆蓋原來數據
load data local ‘///’ into table test; // 從文件加載數據:添加數據
‘tmp/’ a.* from test a; // 導出數據到文件
查詢和分析數據
dfs-ls/user/hive//.db/ // 查看 hdfs 文件信息
.cli.print.=true; 顯示列名稱
.cli.print.=false; 不顯示列名稱
(i)基礎操作
假設表格 的格式是:owner (), key (), value (int), day ();
* from ; // 查找數據
* from limit 10; // 查找10行數據
* from =; //查詢 day= 的數據
* where day >= and day= 并且 day=2.3.0 : yarn -kill $
獲取所有運行的 jobId: yarn -list
FS Shell
調用文件系統 (FS)Shell 命令應使用bin/ fs 的形式。所有的的 FS shell 命令使用 URI路徑作為參數。URI 格式是
:///path。
對HDFS文件系統, 是hdfs,對本地文件系統, 是file。其中 和 參數都是可選的,如果未加指定,就會使用配置中指定的默認 。一個 HDFS 文件或目錄比如//child可以表示成
hdfs://://child,
或者更簡單的
//child
(假設你配置文件中的默認值是:)。大多數 FS Shell 命令的行為和對應的 Unix Shell 命令類似,不同之處會在下面介紹各命令使用詳情時指出。出錯信息會輸出到,其他信息輸出到。
fs 最常用的命令:
fs -ls //查看HDFS目錄下的文件和子目錄
fs -mkdir //在HDFS上創建文件夾
fs -rm //刪除HDFS上的文件
fs -rmr //刪除HDFS上的文件夾
fs -put //將本地文件copy到HDFS上
fs -get //復制HDFS文件到本地
fs -cat //查看HDFS上某文件的內容
fs 查看目錄下文件夾或者文件的大小:
//單位Byte:
fs -du / | sort -n
//單位MB:
fs -du / | awk -F ‘ ‘ ‘{ “%.2fMB\t\t%s\n”, $1/1024/1024,$2}’ | sort -n
//單位GB,大于1G:
fs -du / | awk -F ‘ ‘ ‘{num=$1/1024/1024/1024; if(num>1){ “%.2fGB\t\t%s\n”, num, $2} }’ | sort -n
sort -n 表示按照文件大小,從小到大排列順序。
fs -du-
使用 -h 顯示 hdfs 對應路徑下每個文件夾和文件的大小,文件的大小用方便閱讀的形式表示,例如用64M代替
其余FS Shell命令:
fs -cat //將路徑指定的文件內容輸出到
fs -tail //將文件尾部1k字節的內容輸出到
fs -stat //返回指定路徑的統計信息
fs -du //返回目錄中所有文件的大小,或者只指定一個文件時,顯示該文件的大小
詳細可見:
概述
(分布式拷貝)是用于大規模集群內部和集群之間拷貝的工具。 它使用Map/ 實現文件分發,錯誤處理和恢復,以及報告生成。它把文件和目錄的列表作為 map 任務的輸入,每個任務會完成源列表中部分文件的拷貝。由于使用了 Map/ 方法,這個工具在語義和執行上都會有特殊的地方。這篇文檔會為常用 操作提供指南并闡述它的工作模型。
詳細可見:
推薦教材:
《SQL基礎教程》,作者 【日】MICK 著,孫淼,羅勇 譯
《HIVE編程指南》, , Dean ,Jason 著,曹坤 譯
最后附上一張圖表:HIVE 學習路線圖