文章目錄
hive
hive的基本概念
Hive 作爲一個數據倉庫的工具,特點,操作簡單 上手容易,由於其底層封裝的是MR ,實際上hive不保存數據,數據都是保存在HDFS只上,所以說hive是基於hadoop之上的
hive的基本操作
數據庫的操作
- 創建數據庫 create database 數據庫名稱
- 查看數據庫 show databases
- 刪除數據庫 drop database 數據庫的名稱, 只能刪除空的數據庫 如果要刪除非空的數據庫則需要加上關鍵字 cascade
數據表的操作
- 創建表: create table 表名稱 (屬性 數據類型)
- 可以指定存儲數據的分隔符
create table student(id int,name string)
row format delimited fields terminated by '\t';
管理表與外部表的區別
管理表因爲對錶存在管理權,所以在刪除該表的時候,元數據以及表中的存儲在hdfs上的數據同時都會被刪除,而外部表由於對錶沒有管理權,所以在刪除的時候只會刪除元數據,真正的數據不會被刪除
hive常用交互命令
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
- -e 不進入到hive的交互窗口執行SQL語句
bin/hive -e "select name from student";
通過以上的方式,可以在不進入到hive中就可以執行sql語句進行查詢
2. -f 執行的sql語句來自文件,其實可以理解爲執行一個腳本命令
(1)首先在/data/目錄下創建hivesql.sql文件,在該文件下編寫sql語句
vi test.sql
-----------------
Select * from student;
(2)在hive 的命令行中使用 -f參數執行該創建好的腳本文件,具體操作如下
bin/hive -f /data/hiveql.sql
(3)在-f 之後給定腳本的絕對路徑,之後就可以執行咱們的腳本命令 輸出的結果如下
1 zhangsan
2 lisi
3 banzhang
4 xuewei
- 在hive中也可以直接運行hdfs的命令,在進入hive的命令行模式下,可以直接操作hdfs文件系統,並且由於hive會一直連接hdfs 所以操作的時候會比平時不在hive中操作更快速一些操作的命令如下
hive> dfs -mkdir /test;
hive常見屬性配置
數據倉庫的位置配置 defualt數據庫默認的位置在hdfs上的/user/hive/warehouse的路徑下,沒有對默認數據庫創建目錄
修改默認數據庫的原始位置: 肯定在配置文件中進行修改。
打開hive中conf目錄下發現直存在hive-default.xml.template,該配置文件爲hive中默認的屬性配置文件,在conf目錄下需要配置自定義的配置文件hive-site.xml配置文件,可以參考默認的配置文件進行創建
創建自定義配置文件的步驟
- 複製出來一份默認的配置文件
cp hive-default.xml.template hive-site.xml
- 修改自定義的配置文件裏面的內容,把該屬性清空,只保留頭信息,可以通過4000 dd刪除裏面的內容通過vi的方式
3 通過參考默認配置文件查找需要配置的屬性內容 例如修改默認的數據庫位置則配置信息如下
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
修改之後,還需要爲其增加用戶組的權限
chmod g+w /user/hive/warehouse
配置查詢信息的顯示(頭信息)
- 在hive-site.xml 配置文件中增加如下信息,可以配置數據顯示的名稱.
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
改成true之後觀察hive中顯示的變化
通過觀察發現在配置了該屬性之後,數據的當前名稱可以顯示出來
hive (default)> use test;
- 配置列的頭信息顯示
在hive-site.xml配置文件中增加如下配置,可以顯示頭信息
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
輸出的內容顯示如下
student.id student.name
1 zhangsan
2 lisi
3 banzhang
4 xuewei
配置hive的日誌信息
Hive運行日誌,默認保存在/tmp/hadoop(用戶名)/hive.log 由於保存在/tmp目錄下,該目錄是一個臨時目錄,所以日誌需要經常查看,所以需要修改默認的路徑
修改步驟:
- 在hive的目錄下創建一個目錄命名爲log mkdir log
/opt/app/apache-hive-1.2.1-bin/log
- 接下來要把默認的日誌路徑修改爲自己創建的路徑
(1)進入到hive 的conf目錄下,該目錄下存在一個配置文件爲hive-log4j.properties.template,需要修改該文件,去掉template。應爲加上template hive不識別所以需要去掉template後綴
(2)重命名
mv hive-log4j.properties.template hive-log4j.properties
打開該文件 修改如下屬性
hive.log.dir=${java.io.tmpdir}/${user.name}
修改爲自定義的目錄路徑
hive.log.dir=/opt/app/apache-hive-1.2.1-bin/log
該屬性指定了hive的日誌保存路徑
配置完該屬性之後,重新進入一下hive ,在hive中進行一些命令操作,觀察新配置的目錄是否存在hive.log 日誌
參數的配置方式
- 配置文件的方式
默認的配置文件:hive-default.xml 該文件下存在所有默認屬性配置信息
用戶自定義的配置文件:hive-site.xml 優先級高於默認的配置文件 - 命令行的參數配置
在啓動hive的時候可以通過命令行的方式進行配置 --hiveconf parm=value 來進行設定
例如:bin/hive --hiveconf hive.cli.print.header=false;
以上的配置,僅對本次啓動的hive有效 - 查看參數設置:
set hive.cli.print.current.db; 可以根據set命令查看已經設置的屬性具體的參數內容
得到的結果爲:hive.cli.print.current.db=true - 通過參數進行屬性的設置
範例:set hive.cli.print.current.db=false;
在參數中設置了屬性的內容,接下來可以通過set 方式查看屬性的內容結果爲false
以上的方式也是臨時對本次hive的啓動有效,退出之後在進入hive 就失效了
注意:以上三種方式的優先級 參數方式>命令行方式>自定義配置文件。對於參數方式以及命令方式設置參數內容都是臨時的,自定義配置文件設置的參數,在hive啓動的時候進行讀取
hive數據類型
- 基本數據類型 ,與mysql中的數據類型非常類似。由於hive是java編寫的所以說和mysql 有不一樣的地方
hive的數據類型 | Java 數據類型 |
---|---|
TINYINT | byte |
SMALINT | short |
INT | int |
BIGINT | long |
BOOLEAN | boolean |
FLOAT | float |
DOUBLE | double |
String | String |
TIMESTAMP | 時間類型 |
BINARY | 字節數組 |
對於以上的數據類型,存在數據類型轉換的關係
-
類型的轉換
Hive的數據類型類似於java中的數據類型轉換,例如咱們使用的是INT數據類型,那INTYINT 會自動轉換爲INT類型,但是hive不會像java一樣進行反向轉換 -
CAST 轉換操作:
Cast 可以進行顯示的數據類型的轉換,例如 有一個 “1” 現在需要把字符串類型的1 轉換爲int類型的 1 可以通過cast進行操作
例如: cast(“1” as INT) 就可以把字符串1 轉換爲整數1
DDL數據定義
1. 創建數據庫,創建的數據庫存儲在 HDFS 上的默認路徑是/user/hive/warehouse/*.db
例如: create database mytest;
在創建數據庫的時候,爲了避免創建出錯,可以使用IF NOT EXISTS 先判斷要創建的數據庫是否存在
例如:create database if not exists test2;
2. 刪除數據庫 以下官網提供的語法
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
CASCADE:刪除一個非空的數據庫
3. 表的DDL 定義 (create ,drop ,truncate)
在創建表的時候,可以分爲管理表,和外部表,管理表對數據存在管理權,刪除的時候會刪除到元數據,以及保存在HDFS上的數據,而外部表由於沒有管理權不會刪除掉HDFS上保存的數據,但是會刪除該表的元數據
EXTERNAL 創建外部表,在建表的同時指定一個路徑通過location關鍵字指定該表要去加載的路徑在HDFS上的位置
create EXTERNAL table student4(id int,name string)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student';
對於管理表來說,默認創建的表就爲管理表
分區表:
使用關鍵字PARTITIONED BY 定義的分區表,分區表實際上就是在HDFS上創建一個個的獨立的文件夾,該文件夾下保存的就是爲分區之後的數據文件 ,一般來說進行條件查詢的都是使用where語句 ,那就可以通過where語句查詢分區之後的數據
- 分區表的創建語法:
create table dept_partion(deptno int,dname string) PARTITIONED BY (month string)
row format delimited fields terminated by '\t';
- 接下來加載數據到分區表中,需要把dept 數據文件上傳到linux 文件系統 /data/ 目錄下
load data local inpath '/data/dept.txt' into table dept_partion partition(month='201811');
查詢分區表中的數據:
- 單分區查詢:只查詢一個分區
select * from dept_partion where month='201811';
- 多分區查詢
union
select * from dept_partion where month='201812';
- 增加分區:
alter table dept_partion add partition(month='201810');
- 刪除分區:
alter table dept_partion drop partition(month='201810');
- 查看分區:
show partitions dept_partion;
- 查看錶結構 desc 進行查看,但是不是詳細的信息,如果要查看錶中詳細的信息則可以使用
desc formatted dept_partion;
- 創建兩個分區:
create table dept_partion2(deptno int,dname string) PARTITIONED BY (month string,day string)
row format delimited fields terminated by '\t';
- 加載數據到兩個分區字段的分區表中:
load data local inpath '/data/dept.txt' into table dept_partion2 partition(month='201810',day='18');
分表表加載數據的方式二: 先上傳數據到HDFS上之後在和分區表進行關聯
- 創建要上傳數據的目錄
dfs -mkdir -p /user/hive/warehouse/dept_partion2/month=201809/day=1;
- 上傳數據到該目錄下
dfs -put /data/dept.txt /user/hive/warehouse/dept_partion2/month=201809/day=1;
查詢該表表 發現沒有查詢到該表下的數據
3. 執行關聯元數據的命令
msck repair table dept_partion2;
- 查詢分區表中的數據
select * from dept_partion2 where month=201809 and day=1;
上傳數據之後增加分區:
- 先創建分區目錄
dfs -mkdir -p /user/hive/warehouse/dept_partion2/month=201809/day=2;
- 上傳數據到分區目錄
dfs -put /data/dept.txt /user/hive/warehouse/dept_partion2/month=201809/day=2;
- 增加分區
alter table dept_partion2 add partition(month='201809',day='2');
- 查詢數據
select * from dept_partion2 where month=201809 and day=2;
修改表:
- 修改表名稱
alter table dept_partion rename to dept_partion3;
- 修改列
alter table dept_partion3 change column dname dnames string ;
- 增加列
alter table dept_partion3 add columns (depts string);
- 替換列
alter table dept_partion3 replace columns(deptno int ,dname string);
- 刪除表 drop table 表名稱 表的結構也會被刪除掉
- 清空表中的數據
Truncate 只清空表中的數據,表的結構不刪除