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的配置檔案
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')