hive的資料組織格式和基本操作
hive的資料組織格式:
庫:
管理資料
不同模組的資料最好放在不同的資料庫中
同mysql中的資料庫的概念
表:
內部表:管理表/managed_table
表的建立 表的資料的刪除 都是有hive自己決定的
同mysql中的表
內部表在進行刪除的時候 元資料和原始資料都會被刪除
外部表:external_table
和內部表對立面,一個表不可能同時是內部表又是外部表的
表結構上同內部表
資料自己決定不了
外部表在進行刪除的時候 只能刪除元資料(描述資訊),表的原始資料(hdfs)不會被刪除
分割槽表:
這裡的分割槽的概念不同於MR中的分割槽的概念
hive中有可能一個表非常大,查詢的時候會進行全表掃描,極大的降低hive表的查詢效能
這時候就出現了分割槽表
將原來的一個大的表儲存的時候分成不同的資料目錄進行儲存
沒有分割槽的表儲存:
/user/hive/warehouse/test.db/test01/ test01表對應所有的原始資料儲存目錄
在進行查詢的時候是對上面的整個目錄下的所有的資料進行掃描
有分割槽的表:分割槽欄位
查詢的時候 按照課程進行過濾查詢 按照課程進行分割槽
/user/hive/warehouse/test.db/test01/course=math/
/user/hive/warehouse/test.db/test01/course=en/
/user/hive/warehouse/test.db/test01/course=computer/
按照不同的課程 儲存在不同的目錄下
查詢的時候 只會掃描某一個分割槽的資料 不會全表的掃描了
減少掃描範圍 提升查詢效能
實際生產中 最常用的分割槽欄位 時間欄位
分桶表:
類似於mapreduce中的分割槽的概念
同一個表的資料 儲存在同一個目錄下不同的檔案中
指定分桶的個數 桶的個數----mapreduce的中reducetask的個數 3
/user/hive/warehouse/test.db/test01/part-r-00000
/user/hive/warehouse/test.db/test01/part-r-00001
/user/hive/warehouse/test.db/test01/part-r-00002
作用:
1)提升join的效能
面試題2
2)提升抽樣的效能 資料具有代表性 雜湊
檢視:
view
hive中的檢視 只有邏輯檢視(儲存的僅僅是一個sql語句 不會進行執行的) 沒有物化檢視(將檢視代表的sql進行執行結果)
查詢檢視的時候才會進行執行
hive中的檢視類似於sql語句的快捷方式 儲存的是當前的檢視代表的sql語句
資料儲存:
原始資料:hdfs上
預設情況下儲存在hdfs的:
/user/hive/warehouse
/....db 代表的是資料庫
/test01 代表的是當前資料庫下的表 這個目錄下儲存就是表中的資料
這個目錄可以自定義配置:
hive-site.xml
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/hivehome</value>
<description>hive的原始資料在hdfs的儲存目錄</description>
</property>
元資料:mysql中儲存
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
<!-- 如果 mysql 和 hive 在同一個伺服器節點,那麼請更改 hadoop02 為 localhost -->
</property>
mysql中的myhive庫:
資料庫的描述資訊表:
DBS:描述hive中的資料庫資訊的
庫的儲存位置
hdfs://hadoop01:9000/user/hive/hivehome/test_home.db 6 test_home hadoop USER
在hive表建立一個數據庫在這個表中新增一條資料
TBLS:描述hive中的表的資訊的
TBL_TYPE:描述表的型別的
hive中建立一個表的時候 這個表中新增一條資料
COLUMNS_V2:描述欄位資訊的
表id 欄位名 欄位型別 欄位順序(從0開始 數字越大 證明欄位越在後)
1 name string 1
元資料修改的時候 發現hive中的表的欄位順序變了
說明hive表的結構從元資料表載入來的 原始資料從hdfs載入來的
修改元資料 修改表結構
hive初體驗:
create database test_bd1807;
use test_bd1807;
建表:
1 0 家電
create table jiadian(id int,father_id int,name string)
row format delimited fields terminated by "\t";
載入資料:
load data local inpath '/home/hadoop/fur.txt' into table jiadian;
查詢:
select * from jiadian;
row format delimited 行格式化分割符
列之間的分割符 fields terminated by ''
行分隔符:lines terminated by '\n'
hive的ddl操作:data-define-language
資料庫的操作:
建庫:
create database if not exists test;
切換資料庫:
use test;
檢視正在使用的資料庫:
select current_database();
檢視資料庫列表:
show databases;
show databases like 'test*';
檢視資料庫的詳細描述資訊:
desc database test;----DBS
刪除庫:
drop database if exists test; 只能刪除空的資料庫
drop database test restrict; . restrict
drop database test cascade; 強制刪除非空資料庫
修改資料庫:
不支援
為了避免報錯:
建立的時候加if not exists
刪除:if exists
同樣適用於表操作
表的操作:
1.顯示錶列表:
show tables;
show tables like 'test*';
show tables in test_home; 檢視指定資料庫下的表
2.查看錶的詳細資訊:
desc test01; 可以查看錶的欄位描述資訊
desc extended test01; 查看錶的詳細資訊
desc formatted test01; 格式化顯示錶的詳細資訊
3.刪除表
drop table test01;
4.清空表
清空表中的資料 表結構儲存
truncate table test01;