Hive中多種新建表方式
阿新 • • 發佈:2018-12-12
最基本的建表語句:
create table student(
id string comment '學號',
name string comment '姓名',
sex string comment '性別',
age string comment '年齡'
) comment '學生表';
show create table student;
CREATE TABLE `student`( `id` string COMMENT '學號', `name` string COMMENT '姓名', `sex` string COMMENT '性別', `age` string COMMENT '年齡') COMMENT '學生表' ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://mycluster/user/hive/warehouse/gld.db/student' TBLPROPERTIES ( 'COLUMN_STATS_ACCURATE'='{\"BASIC_STATS\":\"true\"}', 'numFiles'='0', 'numRows'='0', 'rawDataSize'='0', 'totalSize'='0', 'transient_lastDdlTime'='1537867370')
插入樣本資料:
insert into student values('1','孫悟空','男','100');
insert into student values('2','明世隱','男','101');
insert into student values('3','高漸離','男','102');
insert into student values('4','孫尚香','女','103');
insert into student values('5','安琪拉','女','104');
$ hdfs dfs -ls /user/hive/warehouse/gld.db/student Found 5 items -rwxrwxrwx 3 gld supergroup 20 2018-09-25 18:15 /user/hive/warehouse/gld.db/student/000000_0 -rwxrwxrwx 3 gld supergroup 20 2018-09-25 18:18 /user/hive/warehouse/gld.db/student/000000_0_copy_1 -rwxrwxrwx 3 gld supergroup 20 2018-09-25 18:18 /user/hive/warehouse/gld.db/student/000000_0_copy_2 -rwxrwxrwx 3 gld supergroup 20 2018-09-25 18:19 /user/hive/warehouse/gld.db/student/000000_0_copy_3 -rwxrwxrwx 3 gld supergroup 20 2018-09-25 18:19 /user/hive/warehouse/gld.db/student/000000_0_copy_4
$ hdfs dfs -cat /user/hive/warehouse/gld.db/student/000000_0
1孫悟空男100
$ hdfs dfs -cat /user/hive/warehouse/gld.db/student/000000_0_copy_1
2明世隱男101
匯出為CSV格式(會有Tab分隔):
$ hive -e 'use gld; select * from student' > student.csv
student.id student.name student.sex student.age 1 孫悟空 男 100 3 高漸離 男 102 4 孫尚香 女 103 5 安琪拉 女 104 2 明世隱 男 101
create table student(
id string comment '學號',
name string comment '姓名',
sex string comment '性別',
age string comment '年齡'
) comment '學生表'
row format delimited
fields terminated by '\t';
CREATE TABLE…AS…和CREATE TABLE…LIKE…
CREATE TABLE student_bak AS SELECT * FROM student;
完整複製表結構和資料。
CREATE TABLE student2 LIKE student;
僅複製表結構。
內部表與外部表
外部表使用drop刪除表時會刪除表的元資料,但儲存在HDFS目錄下的資料不會刪除。
外部表使用rename重新命名時HDFS目錄下的名字不會改變。
外部表恢復
注意,外部表的恢復需要建表語句的,所以注意要儲存好建表語句呀!
(1) 重新執行create建表語句:
CREATE EXTERNAL TABLE student(
id STRING,
name STRING,
sex STRING,
age STRING
)
PARTITIONED BY (pt string)
STORED AS PARQUET;
(2)修復:
MSCK REPAIR TABLE student
內部錶轉換為外部表
ALTER TABLE student SET TBLPROPERTIES ('EXTERNAL'='TRUE');
create table student stored as parquet as select * from another_table;
這種方式不允許建立外部表,原因暫時不明,佔坑。
以HBase作為儲存方式建表
建立外部表:這個針對HBase中已有的表
HBase:
hbase> create 'gld:student', 'cf1'
Hive:
SET hbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3;
CREATE DATABASE gld;
USE gld;
CREATE EXTERNAL TABLE student(
id STRING,
name STRING,
sex STRING,
age STRING
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf1:name, cf1:sex, cf1:age")
TBLPROPERTIES("hbase.table.name" = "gld:student");
hbase.zookeeper.quorum:設定HBase中ZooKeeper的地址,格式:ip:port,ip:port,ip:port,埠預設2181,可不填。
hbase.columns.mapping:對映HBase中對應的列,格式:列族名:列名,:key表示HBase中的rowkey。
hbase.table.name:對映HBase中對應的表名,格式:名稱空間:表名。
這樣之後,就可以在Hive中通過SQL語句操作HBase中的表了:insert,delete,update,select。
注意點:
- 當HBase已有這個表時,只能通過建外部表進行對映。不能建內部表,否則報以下錯誤:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:Table gld:student already exists within HBase; use CREATE EXTERNAL TABLE instead to register it in Hive.)
- 因為在Hive中這個表是外部表,所以drop命令會刪除Hive中的表,但不會刪除HBase中的表。
- 如果建立外部表時這個表在HBase中不存在,則報以下錯誤:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:HBase table gld:student doesn't exist while the table is declared as xternal table.)
建立內部表:這個針對HBase中並沒有這個表
CREATE TABLE student(
id STRING,
name STRING,
sex STRING,
age STRING
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf1:name, cf1:sex, cf1:age")
TBLPROPERTIES("hbase.table.name" = "gld:student");
注意點:
- drop table student命令會同時刪除Hive中的表和HBase中表!慎重!因此通常都是用第一種方式建立外部表。