Apache Hive


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);

  加載數據

  • 將一個文件直接放到表目錄下面,字段和列的內容進行對應,一定要使用默認的分隔符?不一定,可以通過row format delimited fields terminated by指定

  • 代碼層面"\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 普通表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM