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