天天看點

Hive資料倉庫的具體操作

一、建庫建表

1、建庫

舉例:

2、建表(類似MySQL)

(1)使用create指令建立一個新表

舉例:

(2)把一張表的某些字段抽取出來,建立成一張新表(as),例如:

注意:會複制屬性以及屬性值到新的表中

(3)複制表結構(like),例如:

注意:不會複制屬性值,隻會複制表結構。

3、删表

4、檢視表的詳細資訊

舉例:

二、導入資料(load)

1、從本地導入

舉例:

若Hive預設的存儲路徑為:/user/hive/warehouse,則資料存儲到以下路徑:

/user/hive/warehouse/staff.db/t1。

2、從HDFS系統導入

3、覆寫導入

4、查詢導入

同as方式建表:

5、insert導入

6、覆寫導入

注意:若這裡不指定overwrite,則預設為append/追加。

三、導出資料

1、本地導出,例如:

注意:會遞歸建立目錄

2、HDFS導出,例如:

3、Bash腳本覆寫追加導出,例如:

bin/hive -e "select * from staff;"  > /home/z/backup.log
           

4、Sqoop

具體見sqoop操作

三、Hive中繼資料庫的備份與還原

1、備份

方式1:指令行操作

mysqldump -uroot -p metastore > metastore.sql
           

方式2:資料庫的管理工具(例如:Navicat)操作

2、還原

mysql -uroot -p metastore < metastore.sql
           

四、未登入Hive情況下執行HQL語句

bin/hive -f 檔案.hql
           

五、Hive臨時生效設定

set 屬性名=屬性值
           

例如:臨時設定表頭不顯示

六、指定表存放的位置:location

例如:建一張customer表,放在“/user/hive/warehouse/customer”的目錄下:

hive> CREATE TABLE customer(id int, name string)  location '/user/hive/warehouse/customer';
           

七、Hive的内部表與外部表

1、預設情況:inner,不要加INNER關鍵字,否則報錯

2、顯示指定外部表:external

3、内部表與外部表的相同之處及不同之處

内部表與外部表相同之處:如果你導入資料時,操作于HDFS上,則會将資料進行遷移,并在metastore留下記錄,而不是copy資料源。

不同之處在于:内部表删除表資料時,連同資料源以及中繼資料資訊同時删除,而外部表隻會删除中繼資料資訊(即metastore中的資料)。是以在共享資料方面,外部表相對而言也更加友善和安全。

八、Hive分區表

把資料導入至一張表,用分區區分。

第一步:建立分區表

關鍵詞:partitioned by(字段 字段類型 , ……)

舉例:

create database if not exists company;
create table if not exists company.track_log(
id              string,
url            string,
referer        string,
keyword        string,
type            string,
guid            string,
pageId          string,
moduleId        string,
linkId          string,
attachedInfo    string,
sessionId      string,
trackerU        string,
trackerType    string,
ip              string,
trackerSrc      string,
cookie          string,
orderCode      string,
trackTime      string,
endUserId      string,
firstLink      string,
sessionViewNo  string,
productId      string,
curMerchantId  string,
provinceId      string,
cityId          string,
fee            string,
edmActivity    string,
edmEmail        string,
edmJobId        string,
ieVersion      string,
platform        string,
internalKeyword string,
resultSum      string,
currentPage    string,
linkPosition    string,
buttonPosition  string
)
partitioned by (date string,hour string) -- 分區表的分區字段以逗号分隔
row format delimited fields terminated by '\t';
           

第二步:導入資料到分區表

關鍵詞:partition

舉例:

第三步:查詢資料

例:查詢date為’20150828’且hour為’18’的第一條資料:

九、聚合函數

1、函數的檢視

2、常見的函數

avg

sum

min

max

cast

case

3、舉例

(1)按照empno分組,選出每個empno中的最高sal:MAX()

(2)按照部門進行薪資/sal的排位:ROW_NUMBER() OVER()

(3)聯表:JOIN ON

SELECT e.ename, e.empno, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno
           

(4)case函數

十、自定義UDF函數

1、eclipse中建立一個maven項目,配置pom.xml,增加hive依賴,如下:

<dependency>
		<groupId>org.apache.hive</groupId>
		<artifactId>hive-jdbc</artifactId>
		<version>0.13.1</version>
</dependency>

<dependency>
		<groupId>org.apache.hive</groupId>
		<artifactId>hive-exec</artifactId>
		<version>0.13.1</version>
</dependency>
           

2、編寫函數/類

在“src/main/java”的檔案目錄下編寫類和對應的方法

3、打成jar包

選擇類型:JAR file,并jar包命名

儲存在伺服器上

4、将jar包添加至hive的函數清單中

(1)啟動hive,增加jar包,如下:

(2)添加成功之後,需要将該函數添加至臨時函數清單中

5、展示所有函數

找到自定義的UDF函數

6、使用函數

十一、Hive自動化腳本

1、編寫bash腳本

假設,要将log日志(存儲路徑:/home/admin/Documents/testdata/weblog,按照天命名檔案夾,如:20150828,檔案夾下是按照小時存儲的檔案:2015082818、2015082819……)導入到Hive的表中(即上傳到HDFS中),腳本如下:

#!/bin/bash

#執行系統環境變量腳本,初始化一些變量資訊
. /etc/profile

#定義Hive目錄
HIVE_DIR=/opt/modules/cdh5.3.6/hive-0.13.1-cdh5.3.6/

#定義日志的存儲路徑
WEB_LOG=/home/admin/Documents/testdata/weblog

#定義hql檔案存儲的路徑
HQL_DIR=/home/admin/Documents/hql

#定義日期
DAY=20150828

#周遊目錄
for i in `ls $WEB_LOG/$DAY`
do
	echo "正在導入"$i"資料"
	DATE=${i:0:8}
	HOUR=${i:8:2}
	$HIVE_DIR/bin/hive --hiveconf LOADFILE_NEW=$WEB_LOG/$DAY/$i --hiveconf DATE_NEW=$DATE --hiveconf HOUR_NEW=$HOUR -f $HQL_DIR/auto_track_log.hql
done

           

注意:

(1)–hiveconf是Hive提供的将參數傳遞到hql中執行;

(2)如果想要自動化通路昨天的資料,可以将DAY作如下設定:

(3)這裡不能用hive -e 的寫法,即:

因為,執行的時候hql語句是需要加" “的,而這裡放到腳本中執行的時候” "沒有了。

2、編寫HQL語句

接收bash腳本的參數,用${hiveconf:參數名}接收。

3、執行腳本

十二、Hive中的幾種排序

1、order by

全局排序,就一個Reduce

2、sort by

相當于對每一個Reduce内部的資料進行排序,不是全局排序。

3、distribute by

類似于MR中的partition, 進行分區,一般要結合sort by使用,使用之前要設定reduce數量:

reduce數量 = COUNT(DISTINCT(字段A)),即字段A去重的數量,字段A即distribute by 後面的字段

4、cluster by

當distribute和sort字段相同時,就是cluster by

繼續閱讀