hadoop12--hive的概念, 配置,基本操作

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)

  1. -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
  1. 在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配置文件,可以參考默認的配置文件進行創建

創建自定義配置文件的步驟

  1. 複製出來一份默認的配置文件
cp hive-default.xml.template hive-site.xml
  1. 修改自定義的配置文件裏面的內容,把該屬性清空,只保留頭信息,可以通過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

配置查詢信息的顯示(頭信息)

  1. 在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;

  1. 配置列的頭信息顯示
    在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目錄下,該目錄是一個臨時目錄,所以日誌需要經常查看,所以需要修改默認的路徑
修改步驟:

  1. 在hive的目錄下創建一個目錄命名爲log mkdir log
/opt/app/apache-hive-1.2.1-bin/log
  1. 接下來要把默認的日誌路徑修改爲自己創建的路徑
    (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 日誌

參數的配置方式

  1. 配置文件的方式
    默認的配置文件:hive-default.xml 該文件下存在所有默認屬性配置信息
    用戶自定義的配置文件:hive-site.xml 優先級高於默認的配置文件
  2. 命令行的參數配置
    在啓動hive的時候可以通過命令行的方式進行配置 --hiveconf parm=value 來進行設定
    例如:bin/hive --hiveconf hive.cli.print.header=false;
    以上的配置,僅對本次啓動的hive有效
  3. 查看參數設置:
    set hive.cli.print.current.db; 可以根據set命令查看已經設置的屬性具體的參數內容
    得到的結果爲:hive.cli.print.current.db=true
  4. 通過參數進行屬性的設置
    範例:set hive.cli.print.current.db=false;
    在參數中設置了屬性的內容,接下來可以通過set 方式查看屬性的內容結果爲false
    以上的方式也是臨時對本次hive的啓動有效,退出之後在進入hive 就失效了

注意:以上三種方式的優先級 參數方式>命令行方式>自定義配置文件。對於參數方式以及命令方式設置參數內容都是臨時的,自定義配置文件設置的參數,在hive啓動的時候進行讀取

hive數據類型

  1. 基本數據類型 ,與mysql中的數據類型非常類似。由於hive是java編寫的所以說和mysql 有不一樣的地方
hive的數據類型 Java 數據類型
TINYINT byte
SMALINT short
INT int
BIGINT long
BOOLEAN boolean
FLOAT float
DOUBLE double
String String
TIMESTAMP 時間類型
BINARY 字節數組

對於以上的數據類型,存在數據類型轉換的關係

  1. 類型的轉換
    Hive的數據類型類似於java中的數據類型轉換,例如咱們使用的是INT數據類型,那INTYINT 會自動轉換爲INT類型,但是hive不會像java一樣進行反向轉換

  2. 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上之後在和分區表進行關聯
  1. 創建要上傳數據的目錄
dfs -mkdir -p /user/hive/warehouse/dept_partion2/month=201809/day=1;
  1. 上傳數據到該目錄下
dfs -put /data/dept.txt /user/hive/warehouse/dept_partion2/month=201809/day=1;

查詢該表表 發現沒有查詢到該表下的數據
3. 執行關聯元數據的命令

msck repair table dept_partion2;
  1. 查詢分區表中的數據
select * from  dept_partion2 where month=201809 and day=1;
上傳數據之後增加分區:
  1. 先創建分區目錄
dfs -mkdir -p /user/hive/warehouse/dept_partion2/month=201809/day=2;
  1. 上傳數據到分區目錄
dfs -put /data/dept.txt /user/hive/warehouse/dept_partion2/month=201809/day=2;
  1. 增加分區
alter table dept_partion2 add partition(month='201809',day='2');
  1. 查詢數據
select * from  dept_partion2 where month=201809 and day=2;

修改表:

  1. 修改表名稱
alter table dept_partion rename to dept_partion3;
  1. 修改列
alter table dept_partion3 change column  dname dnames string ;
  1. 增加列
alter table dept_partion3 add columns (depts string);
  1. 替換列
alter table dept_partion3 replace columns(deptno int ,dname string);
  1. 刪除表 drop table 表名稱 表的結構也會被刪除掉
  2. 清空表中的數據
Truncate 只清空表中的數據,表的結構不刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章