1. 程式人生 > >Hive的介紹與使用

Hive的介紹與使用

Hive介紹與使用

資料倉庫的基本介紹

資料倉庫的基本概念:

英文是datawarehourse資料倉庫,主要用於儲存資料和分析性報告以及決策支援,不會產生資料,也不會消費資料

資料倉庫的主要特徵:

面向主題:有確切的分析目標

整合性:相關的資料都會被放入資料倉庫,便於下一步的分析

非易失性:資料一旦進入資料倉庫不會輕易的改變

時變性:根據不同的需求,會產生一些不同的分析維度

資料庫與資料倉庫的區別:

資料庫: OLTP 主要用於聯機事務處理,實現業務資料庫中的增刪改查

資料倉庫:OLAP 主要用於聯機分析處理,實現對資料的分析查詢,操作的都是歷史資料,不會新增,也不會修改

資料倉庫的分層:

分為三層:源資料層、資料倉庫層、資料應用層

源資料層:貼源層 ODS層,主要用於獲取源資料

資料倉庫層:DW層,主要用於對貼源層的資料進行分析,得出想要的結果

資料應用層:APP層,主要用於對倉庫層分析之後的結果進行進一步的展示

資料在各個層級之間流動的過程,稱之為ETL過程(抽取Extra,轉化Transfer,裝載Load)的過程

資料倉庫的元資料管理

主要用於記錄資料庫表之間的關係,資料庫表字段的含義,還有一些資料處理的規則,資料裝載的週期,資料匯出的週期等

hive的基本介紹

hive是基於hadoop的一個數據倉庫工具,可以將hdfs上的結構化資料對映成一張表,hive底層的資料儲存使用的是hdfs,資料的統計計算時使用的MapReduce,可以將hive當作一個MapReduce的客戶端工具,寫的hql語句會被翻譯成mapreduce程式去執行。

資料結構:結構化資料是指欄位個數一定,欄位之間的分隔符一定,半結構化資料是指xml,json這類,非結構化資料是指沒有任何規律格式的資料。

hive特點:

擴充套件性:hadoop叢集的可擴充套件

延展性:支援使用者的自定義函式

容錯性:良好的容錯

hive的架構:

使用者介面:編寫sql語句,提交給hive

解析器:編譯器,將我們的sql語句編譯成一個mapreduce程式

​ 優化器,將sql語句進行優化

​ 執行器:提交mapreduce任務,執行

元資料庫:hive的元資料包含了表與hdfs資料之間的對映關係,預設使用的時derby,一般改用mysql

hive的安裝:

使用mysql作為元資料庫儲存(使用yum源進行安裝)

#解壓hive的安裝包
cd /export/softwares
tar -zxvf hive-1.1.0-cdh5.14.0.tar.gz -C ../servers/
#線上安裝mysql相關的軟體包
yum install mysql mysql-server mysql-devel
#啟動mysql服務
/etc/init.d/mysqld start
#通過mysql安裝的自帶指令碼進行設定
/usr/bin/mysql_secure_installation
#1.沒有root密碼直接回車  2.設定root使用者密碼 3.移除匿名使用者y
#4.是否遠端訪問 n  5.移除測試資料庫 y 6.重新載入mysql y
#進入mysql的客戶端進行授權
mysql -uroot -p
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
#重新整理許可權表
flush privileges;

修改hive的配置檔案

修改hive-env.sh

cd /export/servers/hive-1.1.0-cdh5.14.0/conf
vim hive-site.xml
HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/export/servers/hive-1.1.0-cdh5.14.0/conf

修改hive-site.xml

vim hive-site.xml

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://node03.hadoop.com:3306/hive?createDatabaseIfNotExist=true</value>
        </property>

        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
        </property>
        <property>
                <name>hive.cli.print.current.db</name>
                <value>true</value>
        </property>
        <property>
                <name>hive.cli.print.header</name>
                <value>true</value>
        </property>
        <property>
                <name>hive.server2.thrift.bind.host</name>
                <value>node03.hadoop.com</value>
        </property>
<!--
        <property>
                <name>hive.metastore.uris</name>
                <value>thrift://node03.hadoop.com:9083</value>
        </property>
-->
</configuration>

上傳mysql的lib驅動包

將mysql的lib驅動包上傳到hive的lib目錄下
cd /export/servers/hive-1.1.0-cdh5.14.0/lib
將mysql-connector-java-5.1.38.jar 上傳到這個目錄下

互動方式:

第一種:hive互動shell

bin/hive

第二種:hive JDBC服務

啟動hiveserver2服務

前臺啟動

bin/hive --service hiveserver2

後臺啟動

nohup bin/hive --service hiveserver2  &

beeline連線hiveserver2

bin/beeline
beeline> !connect jdbc:hive2://node03.hadoop.com:10000

第三種:hive命令

使用 –e 引數來直接執行hql的語句

bin/hive -e "use myhive;select * from test;"

使用 –f 引數通過指定文字檔案來執行hql的語句

vim hive.sql
use myhive;select * from test;

bin/hive -f hive.sql

Hive基本操作

建立資料庫操作

建立資料庫

create database if not exists myhive;
use myhive;

hive的庫和表的存放位置由hive-site.xml當中的一個屬性決定

<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>

建立資料庫並指定hdfs的儲存位置

 create database myhive2 location '/myhive2';

修改資料庫

使用alter database 命令來修改資料庫的一些屬性,但是資料庫的元資料資訊是不可更改的,包括資料庫的名稱以及資料庫所在的位置

alter database myhive2 set dbproperties('createtime'='201812');

檢視資料庫的基本資訊

desc  database  myhive2;

檢視資料庫的更多詳細資訊

desc database extended myhive2;

刪除資料庫

刪除一個空的資料庫,如果資料庫下有資料,就會報錯,相應的檔案也會被刪除

drop database myhive2;

建立資料庫表的語法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
   [(col_name data_type [COMMENT col_comment], ...)] 
   [COMMENT table_comment] 
   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
   [CLUSTERED BY (col_name, col_name, ...) 
   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
   [ROW FORMAT row_format] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]

每一行的解釋:

1、建立表的三個關鍵欄位

2、定義表的列名以及型別

3、註釋資訊,只能使用英文或者拼音

4、分割槽:這裡的是hive的分割槽,分的是資料夾

5、分桶:按照欄位進行劃分檔案

6、劃分到多少個桶裡去

7、指定欄位之間的分隔符

8、指定資料的儲存格式為哪一種

9、指定表在hdfs的哪個位置

hive中的表模型

hive建表時的欄位型別

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

(一)管理表(內部表)

建表:

use myhive;
create table stu(id int,name string);
insert into stu values (1,"zhangsan");
select * from stu;

建立表並指定欄位之間的分隔符,指定檔案儲存格式,指定hdfs的儲存位置

create table if not exists stu2(id int,name string) row format delimited fields terminated by '\t' sorted as textfile location '/user/stu2';

根據查詢結果建立表:這種語法會將stu2裡面的資料以及表結構都複製到stu3中

create table stu3 as select * from stu2;

根據已存在的表結構建立表:只複製表結構不復制資料

create table stu4 like stu2;

查詢表的型別

desc formatted stu2;

(二)外部表

說明:外部表的資料都是指定hdfs檔案的檔案路徑載入進來,外部表認為自己沒有獨享資料,所以刪除外部表的時候,不會同步刪除hdfs的資料,與內部表的特徵相反,刪除表的時候,不會刪除表資料

建立學生和老師表,並向表中載入資料

#建立學生表
create external table techer (t_id string,t_name string) row format delimited fields terminated by '\t';
#建立老師表
create external table student (s_id string,s_name string,s_birth string , s_sex string ) row format delimited fields terminated by '\t';

從本地檔案系統向表中載入資料

load data local inpath '/export/servers/hivedatas/student.csv' into table student;

載入資料並覆蓋原有的資料

load data local inpath '/export/servers/hivedatas/student.csv' overwrite into table student;

從hdfs檔案系統向表中載入資料(需要提前將資料上傳到hdfs檔案系統,相當於是移動檔案的操作)

cd /export/servers/hivedatas
hdfs dfs -mkdir -p /hivedatas
hdfs dfs -put techer.csv /hivedatas/
#從hdfs系統上載入資料
load data inpath '/hivedatas/techer.csv' into table techer;

如果刪除student表,hdfs的資料依然存在,並且重新建立表之後,就直接存在資料了,因為student表使用的是外部表,刪除表之後資料依然保留在hdfs上

#刪除教師表
drop table techer;
#檢視教師表
show tables;
#去到資料的儲存目錄,可以發現/user/hive/warehouse/myhive.db/techer下還有techer.csv的資料
#再次建立教師表
create external table techer (t_id string,t_name string) row format delimited fields terminated by '\t';
#直接查看錶 可以看到資料直接就能匯入進去
select * from techer; 

(三)分割槽表:

就是分資料夾,可以按照時間或者其他條件,建立一些資料夾 關鍵詞是partitioned by

建立一個分割槽的表

create table score (s_id string,c_id string,s_score int) partitioned by (month string) row format delimited fields terminated by '\t';

建立多個分割槽的表

create table score2(s_id string,c_id string,s_score int) partitioned by (year string,month string,day string) row format delimited fields terminated by '\t';

載入資料到分割槽

load data local inpath '/export/servers/hivedatas/score.csv' into table score partition (month = '201806');

載入資料到一個多分割槽的表中

load data local inpath '/export/servers/hivedatas/score.csv' into table score2 partition(year='2018',month='06',day='01');

查看錶分割槽

show partitions score;

新增一個分割槽

alter table score add partition(month='201803');

同時新增多個分割槽

alter table score add partition(month='201804') partition(month = '201805');

在新增分割槽之後,就能在hdfs檔案系統上看到表下面多了一個資料夾

刪除分割槽

alter table score drop partition(month = '201803');

(四)分桶表

將資料按照指定的欄位分到多個桶中去,也就是將資料按照欄位進行劃分,可以將資料按照欄位劃分到多個檔案中去

在這之前需要開啟hive的桶表功能,預設是關閉的

set hive.enforce.bucketing = true;
#設定reduce的個數
set mapreduce.job.reduces=3;

建立桶表

建立分桶表的語法 關鍵字:clustered by (col_name) into xx buckets

create table course (c_id string,c_name string,t_id string) clustered by (c_id) into 3 buckets row format delimited fields terminated by '\t';

桶表的資料載入,只能通過insert overwrite來進行資料的載入

建立普通表,通過insert overwrite的方式來將普通表的資料通過查詢的方式載入到桶表中

#建立普通表
create table course_common (c_id string,c_name string,t_id string) row format delimited fields terminated by '\t';
#普通表載入資料
load data local inpath '/export/servers/hivedatas/course.csv' into table course_common;
#通過insert overwrite 給桶表載入資料
insert overwrite table course select * from course_common cluster by (c_id);

修改表

表重新命名

alter table score4 rename to score5;

增加/修改/刪除列資訊

#查詢表結構
desc score5;
#新增列
alter table score5 add columns (mycol string,mysco string);
#更新列
alter table score5 change column mysco mysconew int;
#刪除表
drop table score5;

hive表當中載入資料:

​ load data通過load的方式載入資料

 load data local inpath '/export/servers/hivedatas/score.csv' overwrite into table score partition(month='201806');

​ insert overwrite select
​ 通過一張表,然後將查詢結果插入到另外一張表裡面去

insert overwrite table score4 partition(month='201802') select s_id ,c_id ,s_score from score;

​ 通過查詢語句查詢某張表,並且將資料弄到另外一張表裡面去

Hive引數配置方式

Hive引數大全:
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

對於一般引數,有三種設定方式

配置檔案:

自定義的配置檔案:hive-site.xml

預設的配置檔案:hive-default.xml

使用者自定義的配置會覆蓋預設配置,此外,hive也會去讀入Hadoop的配置,因為hive是作為Hadoop的客戶端啟動的,hive的配置會覆蓋Hadoop的配置,配置檔案對本機的所有hive程序都有效

命令列引數:

啟動hive時,可以在命令列新增-hiveconf param=value來設定引數

引數宣告:

可以在HQL中使用set關鍵字來設定

三種設定方式的優先順序依次遞增,引數宣告>命令列引數>配置檔案引數

hive函式

hive自帶了一些函式,當不能滿足需求時,需要我們自己自定義函式

官方文件地址:

https://cwiki.apache.org/confluence/display/Hive/HivePlugins

程式設計步驟:

1、繼承org.apache.hadoop.hive.ql.UDF

2、需要實現evaluate函式,evaluate支援過載

注意點:

1、UDF必須要有返回值型別,可以返回null,但不能返回void

2、UDF中常用的時Text這樣的型別,不推薦使用java型別

UDF開發例項

實現將一個字母字串全部轉換為大寫

1、建立maven工程,打入jar包

<repositories>
    <repository>
        <id>cloudera</id>
 <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0-cdh5.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>1.1.0-cdh5.14.0</version>
    </dependency>
</dependencies>
<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
         <version>2.2</version>
         <executions>
             <execution>
                 <phase>package</phase>
                 <goals>
                     <goal>shade</goal>
                 </goals>
                 <configuration>
                     <filters>
                         <filter>
                             <artifact>*:*</artifact>
                             <excludes>
                                 <exclude>META-INF/*.SF</exclude>
                                 <exclude>META-INF/*.DSA</exclude>
                                 <exclude>META-INF/*/RSA</exclude>
                             </excludes>
                         </filter>
                     </filters>
                 </configuration>
             </execution>
         </executions>
     </plugin>
</plugins>
</build>

2、編寫java類繼承UDF,並重載evaluate方法

public class ItcastUDF extends UDF {
    public Text evaluate(final Text s) {
        if (null == s) {
            return null;
        }
        //返回大寫字母
        return new Text(s.toString().toUpperCase());
    }
}

3、將專案打包,並上傳到hive的lib目錄下新增jar包

cd /export/servers/hive-1.1.0-cdh5.14.0/lib
mv original-day_06_hive_udf-1.0-SNAPSHOT.jar udf.jar

4、hive的客戶端新增jar包

add jar /export/servers/hive-1.1.0-cdh5.14.0/lib/udf.jar;

5、設定函式與自定義函式關聯

create temporary function tolowercase as 'cn.lsy.udf.ItcastUDF';

6、使用自定義函式

select tolowercase('abc')