风起,唯有努力生存,供学习HSQL的童鞋们参考!
hive中有两种表形式:1.内部表 2.外部表
区别:内部表的数据完全由Hive管理,在hive中用命令删除表(元数据,表结构)也会删除表数据,而外部表的数据不完全由Hive管理,删除表不会删除表的数据(表数据是由hdfs路径中的存储数据的文件映射过来的)
内部表的创建方法基本等同mysql
create table userinfos(
userid int,
username string,
age int,
gender string,
birthday date
)
//导入外部数据时字段之间的分隔方式
row format delimited fields terminated by ',';
//存储为text格式
stored as textfile
create external table customs(
cust_id string,
cust_name string,
age int
)
//处理csv文件中单列有逗号,默认的row format分割方式会错误分割的问题
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
with serdeproperties
(
//分割方式为逗号
'separatorChar' = ',',
//使""内部语句不解析
'quoteChar' = '\"',
//忽略符号\
'escapeChar'= '\\'
)
//导入数据时忽略表头(第一行)
stored as textfile
//hdfs中的位置,如果是目录,映射目录里所有文件
location '/data';
//该属性要放在最后面
tblproperties("skip.header.line.count"="1")
附:OpenCSVSerde 默认的分隔符(separator)、quote 以及逃逸字符(escape characters )分别为 \、" 以及 ’
1.CTAS----as select
该方式不支持创建外部表,分区,分桶
create table student as select * from teacher;
2.CTE(hive独有,类似子查询)
CREATE TABLE employee AS
WITH
r1 AS (SELECT name FROM r2 WHERE name = 'Michael'),
r2 AS (SELECT name FROM employee WHERE sex_age.sex= 'Male'),
r3 AS (SELECT name FROM employee WHERE sex_age.sex= 'Female')
SELECT * FROM r1 UNION ALL SELECT * FROM r3;
3.like-----创建表结构相同的新表(包括分区),但是不复制数据
create table new_table like existing_table;
主要是通过alter table 命令
1.增加列
//增加id列,类型为int
alter table student add columns(id int)
2.删除列
alter table student drop column id;
3.修改列名和类型
////原列名id改为sid,类型改为string
alter table student change column id sid string;
4.替换列
//实质是先将age列删除,然后再添加新列name
alter table student replace columns(age int,name string);
5.修改表名
注:内部表更新表元数据和hdfs中存放表的目录名称,外部表只更新元数据,不更改存放数据的目录名称(映射文件)
alter table student rename to new_student;
hive中不支持update,因为数据仓库的特性是要求数据是集成稳定的
1.insert into 追加插入
//table关键字可以省略
insert into (table) tb_b select * from tb_a
2.insert overwrite 覆盖原表插入
//table关键字不可省略
insert overwrite table tb_b select * from tb_a
3.load data
load data local inpath '/opt/mydata.csv' overwrite into table test partition(country=’CHINA’);
注释:
i).local表示从本地加载数据(拷贝) 无local表示从hdfs中加载数据(文件直接被移动,并且不改文件名)
ii).overwrite 表示覆盖表中数据,无overwrite则是追加,且不会滤重(如果有数据重复会自动重命名)
iii)partition为分区,后面介绍
4.location 文件映射,一般创建外部表时用
hive中不支持delete table t_name
truncate table t_name;
drop table tb_name
drop database db_name