1. 程式人生 > >Hive中多種新建表方式

Hive中多種新建表方式

最基本的建表語句:

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。

注意點:

  1. 當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.)
  2. 因為在Hive中這個表是外部表,所以drop命令會刪除Hive中的表,但不會刪除HBase中的表。
  3. 如果建立外部表時這個表在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");

注意點:

  1. drop table student命令會同時刪除Hive中的表和HBase中表!慎重!因此通常都是用第一種方式建立外部表。