1.Hive簡介
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類SQL查詢功能。
本質是將SQL轉換為MapReduce程序。
主要用途:操作接口采用類SQL語法,提供快速開發的能力,功能擴展方便,用來做離線分析,比直接用MapReduce開發效率更高。
2.Hive架構
2.1Hive架構圖
2.2Hive組件
用戶接口:包括CLI、JDBC/ODBC、WebGUI。其中CLI(command line interface)為shell命令行;JDBC/ODBC是hive的JAVA試下,與傳統數據庫JDBC類似;WebGUI是通過瀏覽器訪問Hive。
元數據存儲:通常是存儲在關系數據庫中如mysql/derby中。Hive將元數據存儲在數據庫中。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表),表的數據所在的目錄等。
解釋器、編譯器、優化器、執行器:完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划生成。生成的查詢計划存儲在HDFS中,並在隨后又MapReduce調用執行。
2.3Hive與Hadoop的關系
Hive利用HDFS存儲數據,利用MapReduce查詢分析數據。
3.Hive與傳統數據庫對比
Hive用於海量數據數據的離線數據分析。
Hive具有sql數據庫外表,但應用場景完全不同,hive只適合用來做批量數據統計分析。
4.Hive數據模型
Hive中所有的數據都存儲在HDFS中,沒有專門的數據存儲格式。
在創建表時指定數據中的分隔符,Hive就可以映射成功,解析數據。
Hive中包含以下數據模型
db:在HDFS中表現為hive。metastore.warehouse.dir目錄下一個文件夾。
table:在HDFS中表現所屬db目錄下一個文件夾。
external table:數據存放位置可以在HDFS任意指定路徑。
partition:在HDFS中表現為table目錄下的子目錄。
bucket:在HDFS中表現為同一個目錄下根據hash散列之后的多個文件。
5.安裝部署
Hive安裝前需要安裝好JDK和Hadoop。配置好環境變量。如果需要使用mysql來存儲數據,需要提前安裝好mysql。
5.1metadata、metastore
Metadata即元數據。元數據包含用Hive創建的database、table、表的字段等元信息。元數據存儲在關系型數據庫中。如hive內置的Derby、第三方如Mysql等。
Metastore即元數據服務,作用是:客戶端連接metastore服務,metastore再去連接Mysql數據庫來存取元數據。有了metastore服務,就可以有多個客戶端同時進行連接,而且這些客戶端不需要知道mysql數據庫的用戶名和密碼,只需要連接metastore服務即可。
5.2metastore三種配置方式--hive安裝方式
- 內嵌模式:解壓縮即可,默認使用的數據庫是derby,通常過家家的方法
本地模式
修改配置文件
修改配置文件hive-env.sh
export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0/
修改配置文件hive-site.xml
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop01: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.metastore.uris</name> <value>thrift://hadoop01:9083</value> </property> </configuration>
缺點:每連接一次hive,都會啟動一個metastore進程,浪費資源
- 遠程模式
配置hive-site.xml
<property> <name>hive.metastore.uris</name> <value>thrift://node01:9083</value> </property>
啟動metastore
#前台啟動--好處可以直接看到日志信息,壞處ctrl+C服務就停止,在當前連接中不能操作其他 bin/hive --service metastore #后台啟動 --壞處,看日志需要去找到日志文件,好處的話,不影響其他操作 nohup bin/hive --service metastore &
5.3連接方式
- 第一種連接方式--過時
#啟動metastore服務器
bin/hive
- 第二種連接方式
配置hive.site.xml
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node01</value>
</property>
啟動hiveserver2服務
#啟動metastore服務器
nohup bin/hive --service hiveserver2 &
連接
!connect jdbc:hive2://node01:10000 root 123456
6.Hive基本操作
6.1DDL操作(數據定義語言)
- DDL數據庫的定義語言 創建、修改和刪除庫、表、字段
- DCL數據庫的控制語言 授權
- DQL數據庫查詢語言 select
- DML數據庫測操作語言 增刪改
DDL操作
- 內部表:當創建表的時候沒有指定external關鍵字,就是一個內部表,外部的表象,這個表的文件默認會放在對應的數據庫的文件夾,---刪除的時候,元數據信息和HDFS上文件數據都被刪除掉。
- 外部表:當創建表的時候需要指定external關鍵字,就是一個外部表,外部的表象這個表可以在HDFS的任意位置,--刪除外部表的時候,元數據就會別刪除,HDFS的文件數據不會刪除的。
內部表操作
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]
創建一張簡單的表
create table t_user(id int,name string,age int);
加載數據
-
-
代碼層面"\001",非打印字符,vi編輯命令下可以通過ctrl+v和ctrl+a輸入
-
為什么不用其他的分割符?---通常使用默認分隔符\001、制表符\t或逗號
-
手動指定分割符
create table if not exists t_student(sid int comment 'key',name int,sex string) row format delimited fields terminated by '\t'; --if not exists 判斷表是否存在 --comment 字段或表的注釋信息 --row format 行的格式化 delimited fields terminated by 指定分隔符
- 文件中的字段類型,hive會嘗試的去轉換,不保證一定轉換成功
外部表
創建一個外部表
create external table if not exists t_student_ext(sid int comment 'key',name int,sex string) row format delimited fields terminated by '\t' location "/hive"; --external 創建外部表 --location 指定外部表的文件所在路徑
分區表
分區表:會在表的文件夾下創建多個子目錄,數據會放到各個子目錄中
創建分區表
create table t_user_part(id int,name string,country string) partitioned by (guojia string) row format delimited fields terminated by ',' ; --注意順序問題 --分區的字段不能是表當中的字段
加載數據--必須登錄到hive的窗口執行
load data local inpath './root/4.txt' into table t_user_part partition (guojia='usa'); load data local inpath '/root/5.txt' into table t_user_part partition (guojia='china'); --將數據加載到哪個文件夾中
為什么要有分區表?是一個用於優化查詢的表
減少全文檢索的問題
通常分區的字段有哪些?省市區 時間
多級分區
create table t_order(id int,pid int,price double) partitioned by (year string,month string,day string) row format delimited fields terminated by ',' ; load data local inpath '/root/5.txt' into table t_order partition (year='2019',month='09',day='18'); load data local inpath '/root/4.txt' into table t_order partition (year='2019',month='09',day='17');
分通表
創建表
create table stu_buck2(Sno string,Sname string,Sbrithday string, Sex string) clustered by(Sno) into 4 buckets row format delimited fields terminated by '\t'; --clustered by 根據哪個字段去分桶,這個字段在表中一定存在 --into N buckets 分多少個文件 --如果該分桶字段是string,會根據字符串的hashcode % bucketsNum --如果該分桶字段是數值類型,數值 % bucketsNum
--創建普通表 create table student2(Sno string,Sname string,Sbrithday string, Sex string) row format delimited fields terminated by '\t'; --開啟分桶 set hive.enforce.bucketing = true; set mapreduce.job.reduces=4; --insert+select insert overwrite table stu_buck2 select * from student2 cluster by(Sno); --默認不讓直接使用分桶表
為什么創建分桶表?也是一個優化表
優化join的笛卡爾積
加載數據
內部表和外部表:將文件直接上傳到hdfs對應的表的目錄下面即可,分隔符
分區表:load data local into table
分通表:insert overwrite table 分通表 select * from 普通表