Hive的安裝和基礎編程

轉載自廈門大學林子雨開設的《大數據技術原理與應用》

一、安裝hive

1. 下載並解壓hive源程序

Hive下載地址


注意,上面的dblab:dblab是用戶組和用戶名,如果你當前使用用戶名hadoop登錄了Linux系統,則把dblab替換成hadoop。2. 配置環境變量爲了方便使用,我們把hive命令加入到環境變量中去,請使用vim編輯器打開.bashrc文件,命令如下:


在該文件最前面一行添加如下內容:

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export HADOOP_HOME=/usr/local/hadoop

HADOOP_HOME需要被配置成你機器上Hadoop的安裝路徑,比如這裏是安裝在/usr/local./hadoop目錄。

保存退出後,運行如下命令使配置立即生效:


3. 修改/usr/local/hive/conf下的hive-site.xml執行如下命令:


上面命令是將hive-default.xml.template重命名爲hive-default.xml;

然後,使用vim編輯器新建一個配置文件hive-site.xml,命令如下:


在hive-site.xml中添加如下配置信息:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
</configuration>

然後,按鍵盤上的“ESC”鍵退出vim編輯狀態,再輸入:wq,保存並退出vim編輯器。

二、安裝並配置mysql

這裏我們採用MySQL數據庫保存Hive的元數據,而不是採用Hive自帶的derby來存儲元數據。

1.Ubuntu下mysql的安裝請參考Ubuntu安裝MySQL

2.下載mysql jdbc 包,下載地址


3. 啓動並登陸mysql shell


4. 新建hive數據庫


5. 配置mysql允許hive接入:


6. 啓動hive

啓動hive之前,請先啓動hadoop集羣。


注意,我們這裏已經配置了PATH,所以,不要把start-all.sh和hive命令的路徑加上。如果沒有配置PATH,請加上路徑才能運行命令,比如,本教程Hadoop安裝目錄是“/usr/local/hadoop”,Hive的安裝目錄是“/usr/local/hive”,因此,啓動hadoop和hive,也可以使用下面帶路徑的方式:


使用mysql作爲元數據庫時登陸使用mysql作爲元數據庫時登陸

在啓動Hive時,有可能會出現Hive metastore database is not initialized的錯誤,這裏給出解決方案。

解決Hive啓動,Hive metastore database is not initialized的錯誤。出錯原因:以前曾經安裝了Hive或MySQL,重新安裝Hive和MySQL以後,導致版本、配置不一致。解決方法是,使用schematool工具。Hive現在包含一個用於 Hive Metastore 架構操控的脫機工具,名爲 schematool.此工具可用於初始化當前 Hive 版本的 Metastore 架構。此外,其還可處理從較舊版本到新版本的架構升級。所以,解決上述錯誤,你可以在終端執行如下命令:


執行後,再啓動Hive,應該就正常了。啓動進入Hive的交互式執行環境以後,會出現如下命令提示符:


可以在裏面輸入SQL語句,如果要退出Hive交互式執行環境,可以輸入如下命令:


三、Hive的常用HiveQL操作

1)Hive基本數據類型

首先,我們簡單敘述一下HiveQL的基本數據類型。

Hive支持基本數據類型和複雜類型, 基本數據類型主要有數值類型(INT、FLOAT、DOUBLE ) 、布爾型和字符串, 複雜類型有三種:ARRAY、MAP 和 STRUCT。

a.基本數據類型

  • TINYINT: 1個字節
  • SMALLINT: 2個字節
  • INT: 4個字節
  • BIGINT: 8個字節
  • BOOLEAN: TRUE/FALSE
  • FLOAT: 4個字節,單精度浮點型
  • DOUBLE: 8個字節,雙精度浮點型STRING 字符串

b.複雜數據類型

  • ARRAY: 有序字段
  • MAP: 無序字段
  • STRUCT: 一組命名的字段

2)常用的HiveQL操作命令

Hive常用的HiveQL操作命令主要包括:數據定義、數據操作。接下來詳細介紹一下這些命令即用法(想要了解更多請參照《Hive編程指南》一書)。

a.數據定義:主要用於創建修改和刪除數據庫、表、視圖、函數和索引。

創建、修改和刪除數據庫


注意,除 dbproperties屬性外,數據庫的元數據信息都是不可更改的,包括數據庫名和數據庫所在的目錄位置,沒有辦法刪除或重置數據庫屬性。

創建、修改和刪除表

#創建內部表(管理表)
create table if not exists hive.usr(
      name string comment 'username',
      pwd string comment 'password',
      address struct<street:string,city:string,state:string,zip:int>,
      comment  'home address',
      identify map<int,tinyint> comment 'number,sex') 
      comment 'description of the table'  
     tblproperties('creator'='me','time'='2016.1.1'); 
#創建外部表
create external table if not exists usr2(
      name string,
      pwd string,
  address struct<street:string,city:string,state:string,zip:int>,
      identify map<int,tinyint>) 
      row format delimited fields terminated by ','
     location '/usr/local/hive/warehouse/hive.db/usr'; 
#創建分區表
create table if not exists usr3(
      name string,
      pwd string,
      address struct<street:string,city:string,state:string,zip:int>,
      identify map<int,tinyint>) 
      partitioned by(city string,state string);    
#複製usr表的表模式  
create table if not exists hive.usr1 like hive.usr;
 
show tables in hive;  
show tables 'u.*';        #查看hive中以u開頭的表
describe hive.usr;        #查看usr表相關信息
alter table usr rename to custom;      #重命名錶
 
#爲表增加一個分區
alter table usr2 add if not exists 
     partition(city=”beijing”,state=”China”) 
     location '/usr/local/hive/warehouse/usr2/China/beijing'; 
#修改分區路徑
alter table usr2 partition(city=”beijing”,state=”China”)
     set location '/usr/local/hive/warehouse/usr2/CH/beijing';
#刪除分區
alter table usr2 drop if exists  partition(city=”beijing”,state=”China”)
#修改列信息
alter table usr change column pwd password string after address;
 
alter table usr add columns(hobby string);                  #增加列
alter table usr replace columns(uname string);              #刪除替換列
alter table usr set tblproperties('creator'='liming');      #修改表屬性
alter table usr2 partition(city=”beijing”,state=”China”)    #修改存儲屬性
set fileformat sequencefile;             
use hive;                                                   #切換到hive數據庫下
drop table if exists usr1;                                  #刪除表
drop database if exists hive cascade;                       #刪除數據庫和它中的表

視圖和索引的創建、修改和刪除

主要語法如下,用戶可自行實現。


因爲視圖是隻讀的,所以 對於視圖只允許改變元數據中的 tblproperties屬性。


這裏’org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’是一個索引處理器,即一個實現了索引接口的Java類,另外Hive還有其他的索引實現。


如果使用 deferred rebuild,那麼新索引成空白狀態,任何時候可以進行第一次索引創建或重建。


用戶自定義函數

在新建用戶自定義函數(UDF)方法前,先了解一下Hive自帶的那些函數。show functions; 命令會顯示Hive中所有的函數名稱:

若想要查看具體函數使用方法可使用describe function 函數名:

首先編寫自己的UDF前需要繼承UDF類並實現evaluate()函數,或是繼承GenericUDF類實現initialize()函數、evaluate()函數和getDisplayString()函數,還有其他的實現方法,感興趣的用戶可以自行學習。

另外,如果用戶想在Hive中使用該UDF需要將我們編寫的Java代碼進行編譯,然後將編譯後的UDF二進制類文件(.class文件)打包成一個JAR文件,然後在Hive會話中將這個JAR文件加入到類路徑下,在通過create function語句定義好使用這個Java類的函數。


3)數據操作

主要實現的是將數據裝載到表中(或是從表中導出),並進行相應查詢操作,對熟悉SQL語言的用戶應該不會陌生。

向表中裝載數據

這裏我們以只有兩個屬性的簡單表爲例來介紹。首先創建表stu和course,stu有兩個屬性id與name,course有兩個屬性cid與sid。


向表中裝載數據有兩種方法:從文件中導入和通過查詢語句插入。

a.從文件中導入

假如這個表中的記錄存儲於文件stu.txt中,該文件的存儲路徑爲/usr/local/hadoop/examples/stu.txt,內容如下。

stu.txt:

1 xiapi 
2 xiaoxue 
3 qingqing

下面我們把這個文件中的數據裝載到表stu中,操作如下:


如果stu.txt文件存儲在HDFS 上,則不需要 local 關鍵字。

b.通過查詢語句插入

使用如下命令,創建stu1表,它和stu表屬性相同,我們要把從stu表中查詢得到的數據插入到stu1中:


上面是創建表,並直接向新表插入數據;若表已經存在,向表中插入數據需執行以下命令:


這裏關鍵字overwrite的作用是替換掉表(或分區)中原有數據,換成into關鍵字,直接追加到原有內容後。

從表中導出數據

a.可以簡單拷貝文件或文件夾

命令如下:


b.寫入臨時文件

命令如下:


查詢操作

和SQL的查詢完全一樣,這裏不再贅述。主要使用select…from…where…等語句,再結合關鍵字group by、having、like、rlike等操作。這裏我們簡單介紹一下SQL中沒有的case…when…then…句式、join操作和子查詢操作。

case…when…then…句式和if條件語句類似,用於處理單個列的查詢結果,語句如下:


結果如下:

連接
連接(join)是將兩個表中在共同數據項上相互匹配的那些行合併起來, HiveQL 的連接分爲內連接、左向外連接、右向外連接、全外連接和半連接 5 種。

a. 內連接(等值連接)
內連接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。

首先,我們先把以下內容插入到course表中(自行完成)。

1 3
2 1
3 1

下面, 查詢stu和course表中學號相同的所有行,命令如下:


執行結果如下:

b. 左連接左連接的結果集包括“LEFT OUTER”子句中指定的左表的所有行, 而不僅僅是連接列所匹配的行。如果左表的某行在右表中沒有匹配行, 則在相關聯的結果集中右表的所有選擇列均爲空值,命令如下:


執行結果如下:

c. 右連接

右連接是左向外連接的反向連接,將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將爲左表返回空值。命令如下:


執行結果如下:

d. 全連接全連接返回左表和右表中的所有行。當某行在另一表中沒有匹配行時,則另一個表的選擇列表包含空值。如果表之間有匹配行,則整個結果集包含基表的數據值。命令如下:


執行結果如下:

e. 半連接

半連接是 Hive 所特有的, Hive 不支持 in 操作,但是擁有替代的方案; left semi join, 稱爲半連接, 需要注意的是連接的表不能在查詢的列中,只能出現在 on 子句中。命令如下:


執行結果如下:

子查詢標準 SQL 的子查詢支持嵌套的 select 子句,HiveQL 對子查詢的支持很有限,只能在from 引導的子句中出現子查詢。

注意,在定義或是操作表時,不要忘記指定所需數據庫。

四、Hive簡單編程實踐

下面我們以詞頻統計算法爲例,來介紹怎麼在具體應用中使用Hive。詞頻統計算法又是最能體現MapReduce思想的算法之一,這裏我們可以對比它在MapReduce中的實現,來說明使用Hive後的優勢。

MapReduce實現詞頻統計的代碼可以通過下載Hadoop源碼後,在 $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar 包中找到(wordcount類),wordcount類由63行Java代碼編寫而成。下面首先簡單介紹一下怎麼使用MapReduce中wordcount類來統計單詞出現的次數,具體步驟如下:

1)創建input目錄,output目錄會自動生成。其中input爲輸入目錄,output目錄爲輸出目錄。命令如下:


2)然後,在input文件夾中創建兩個測試文件file1.txt和file2.txt,命令如下:


3)執行如下hadoop命令:


4)我們可以到output文件夾中查看結果,結果如下:

下面我們通過HiveQL實現詞頻統計功能,此時只要編寫下面7行代碼,而且不需要進行編譯生成jar來執行。HiveQL實現命令如下:


執行後,用select語句查看,結果如下:

由上可知,採用Hive實現最大的優勢是,對於非程序員,不用學習編寫Java MapReduce代碼了,只需要用戶學習使用HiveQL就可以了,而這對於有SQL基礎的用戶而言是非常容易的。


----------

一些知識點
&HIVE
    1.元數據存在mysql
    2.數據存在hdfs
    3.內部表drop後元/數據都刪除,外部表只刪去元數據
    4.安裝需要創建mysql的 hive賬戶,用來存儲元數據,授予權限。
    5.beeline 使用:bin/beeline
&flume
    >啓動agent:bin/flume-ng agent -c conf -f conf/netcat-logger.conf(xxx-xxx.conf 配置採集方案) -n a1  
    1.採集源,即source——監控文件內容更新 :  exec  ‘tail -F file’
    2.下沉目標,即sink——HDFS文件系統  :  hdfs sink
    3.Source和sink之間的傳遞通道——channel,可用file channel 也可以用 內存channel
&分區表:
 create table part
    > (id int,name string,size string,price int)
    > partitioned by (dates string)
    > row format delimited
    > fields terminated by '\t';
分區表在導入數據時分區:指定partflag分區標誌。
    分區標誌  partitioned by (xxx string) 是不存在於表結構以及原數據內的,是指定的。
load data local inpath '/home/phone.txt' into table part partition(dates='2016-10-1');

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