hive 常見數據結構:
1,struct 大約 c語言之中的結構體,都可以使用'.'來進行訪問元素的內容
2,map 鍵值對
3,array 數組
創建文件
xiaoming,lili_bingbing,xiao xiao:18_xiaoqiang song :19 tong luo wan
針對以上數據創建表:根據行來進行創建 ,指定每一行的數據類型與分隔符
create table test(
name string,
friends array<string>,
address struct<street:string, city:string>
) row format delimited
fields terminated by ',' /*每行以,分割*/
collection items terminated by '_'
map keys terminated by ':'
/* 查詢*/
select friends[1],address.city from test;
使用 jdbc 連接 hive, 需要開啟 hiveserver2
# 需要 bin/hiveserver2
./beeline -u jdbc:hive2://master:10000
# 或者 !connect jdbc:hive2://master:10000
內部表與外部表:
1,內部表數據由Hive自身管理,外部表數據由HDFS管理
2,刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
表分區:
1,在 hive 之中表是以文件夾(最大值為block 大小)的形式展示的,以文件的角度來說,分區是表文件增加子目錄,子目錄存儲文件
2,hive 沒有索引,因此使用分區(指定文件夾)來避免全局掃描
/*數據庫增加表字段類型*/
alter database sga set dbproperties("ctime"="1990-28-18");
/*查看數據庫(包括隱藏字段)*/
desc database extended sga;
drop database sga cascade; /*級聯刪除 也會將 hdfs 之中的文件進行刪除!*/
/*修改表名稱 但是不支持數據庫重命名*/
alter table test rename to FPGA;
/*表增減字段*/
alter table stu add columns(gg string,address struct <street:string, city:string >)
/* 執行的 mr 任務,不僅創建表結構,還會將數據加載進去 */
create table students as select * from stu;
/* 只有表結構的數據*/
create table student1 like stu;
/* 查看表詳細信息 */
desc formatted student;
/*默認創建的是管理表(內部表),使用 external關鍵字創建外部表*/
create external table dept(dept int ,dname string, loc int) row format delimited fields terminated by '\t';
/* 外部表刪除會將原始數據不會刪除!可以重新建表*/
drop table dept
/*內部表轉化成外部表(區分大小寫,單雙引號,不然會加屬性) Table Type: EXTERNAL_TABLE */
alter table student set tblproperties('EXTERNAL'='TRUE');
/*內部表轉化成外部表 Table Type: MANAGED_TABLE*/
alter table student set tblproperties('EXTERNAL'='FALSE');
/*創建分區表*/
create table stu_partition(id int,name string) partitioned by(month string) row format delimited fields terminated by '\t';
/*分區表插入數據 ,也就是指定表文件下的子文件夾 /user/hive/warehouse/stu_partition/month=19960712*/
load data local inpath '/home/hadoop/hive/bin/stu.txt' into table stu_partition partition(month=19960712);
/*按照表分區進行查詢,表分區是加了一個表字段*/
select * from stu_partition where month=19960712 or month=19960711;
/*為表增加兩個分區*/
alter table stu_partition add partition(month=19960721) partition(month=19960722);
/*為表刪除一個分區,多個使用 ',' */
alter table stu_partition drop partition(month=19960721),partition(month=19960722);
hive 序列化操作 針對文件為
192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1" 304 -
192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-nav.png HTTP/1.1" 304 -
192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /asf-logo.png HTTP/1.1" 304 -
192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-button.png HTTP/1.1" 304 -
192.168.57.4 - - [29/Feb/2016:18:14:3
192.168.57.4 -
創建 sql 語句
CREATE TABLE logtbl1 (
host STRING,
identity STRING,
t_user STRING,
time STRING,
request STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)"
)STORED AS TEXTFILE;
查詢結果(hive 讀時檢查數據格式,如果不正確,那么久會顯示 null)

hive 動態分區:
# 修改權限 開啟動態分區
set hive.exec.dynamic.partiton=true
#修改默認狀態 默認strict。至少有一個靜態分區
set hive.exec.dynamic.partiton.mode=nostrict
首先創建原始表, 然后 load 數據, 使用另外表進行數據分區
create table tb_p0(
id int,
name string,
likes array<string>,
age int ,
sex string,
address map<string ,string>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
create table tb_p1(
id int,
name string,
likes array<string>,
address map<string ,string>
)
partitioned by (age int ,sex string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
/*已經存在的表格並且要有數據 */
from tb_p0
insert overwrite table tb_p2 partiton (age,sex)
select * distribute by age,sex