1、`load data local inpath '/root/tes.txt' into table test.usr;`
将本地的数据导入到hive中
2、`load data inpath 'hdfs://node01:9000/user/tes.txt' into table test.te;`
从hdfs集群导入数据
LOAD DATA命令,可分为LOAD DATA LOCAL INPATH和LOAD DATA INPATH。两者的区别在于LOCAL导入的是本地文件而不加LOCAL的导入的是HDFS文件
3、`insert into`
4、
from table1
insert into tables2
select id ,name
内部表–删除之后数据全部丢失
外部表–删除元数据之后源数据还存在
1、结构一样,但是数据不一样 ----like
create table bws like te;
2、结构一样,数据也一样----as
create table bws2 as select * from tes;
ROW FORMAT DELIMITED : 行格式分隔
FIELDS TERMINATED BY ’,’ : 字段之间使用空格分隔
COLLECTION ITEMS TERMINATED BY ‘-’ : 集合(就是这的数据)使用逗号分隔
MAP KEYS TERMINATED BY ‘:’ : 键值对使用冒号分隔
LINES TERMINATED BY ‘\n’ : 记录之间使用换行符分隔,不能用\t(本人测试过的)
课下作业:
create table psn1(
id int,
name varchar(11),
hobby array,
address map
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ’,’
COLLECTION ITEMS TERMINATED BY ‘-’
MAP KEYS TERMINATED BY ‘:’
LINES TERMINATED BY ‘\n’
数据格式:
11,小明11,lol-book-movie,beijing:bawei-shanghai:putdong
11,小明12,lol-book-movie,beijing:bawei-shanghai:putdong
11,小明11,lol-book-movie,beijing:bawei-shanghai:putdong
11,小明14,lol-book-movie,beijing:bawei-shanghai:putdong
创建表:
Hive 内部表
CREATE TABLE [IF NOT EXISTS] table_name
删除表时,元数据与数据都会被删除
Hive 外部表 ----EXTERNAL
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name LOCATION hdfs_path
删除外部表只删除metastore的元数据,不删除hdfs中的表数据
Hive 查看表描述
DESCRIBE [EXTENDED|FORMATTED] table_name
extended
formatted
table-type:查看创建表的类型
**补充:**临时表
在当前进程中可以对数据进行相应的操作,但是退出hive时,就自动删除
create temporary table name-----一定是一张内部表
必须在表定义时指定对应的partition字段
a、单分区建表语句:
create table day_table (id int, content string) partitioned by (dt int);
上传数据:
load data local inpath '/root/tes.txt' into table test.usr partition (age=10);
单分区表,按天分区,在表结构中存在id,content,dt三列。
以dt为文件夹区分
粗细力度分区的时候要根据业务需求,提前进行相应的设定 年月日时分秒
b、 双分区建表语句:
create table hour(id int, content string) partitioned by (dt int, hour int);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
先以dt为文件夹,再以hour子文件夹区分
增加分区
alter table hour add partition(dt=10,hour=40);
alert table tablename add partiton(age=10,sex='man')
也就是说添加分区的时候不能直接添加,而是需要将原来的分区也要包含其中,完成相应的排序、
删除分区
alter table tablename drop partition (sex='boy')
注:删除分区的时候,会将所有存在的分区都删除
动态分区:
1、修改权限
set hive.exec.dynamic.partiton=true //开启动态分区
2、修改默认状态
set hive.exec.dynamic.partiton.mode=nostrict //默认strict。至少有一个静态分区
创建分区表:
create table psn22(
id int,
name string,
likes array,
address map
)
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 psn21 //已经存在的表格并且要有数据
insert overwrite table pas22 partiton (age,sex)
select * distribute by age,sex
分区表写入数据两种方式:
前提是要有一个有分区的表,最好无数据,
第一种:
load data local inpath '/root/tes.txt' into table test.usr partition (age=10);
利用这条命令,括号里给你定义的分区赋值,导入的本地数据文件里可以不用拟定分区数据
这样添加,一次只能添加一个分区的数据,想要添加另一个分区数据可以在执行一遍这条语句,并且赋不同的分区值。
此方法相对来说比较灵活
第二种:
from psn21 //已经存在的表格并且要有数据
insert overwrite table pas22 partiton (age,sex)
select * distribute by age,sex
执行这条语句的前提是最好要有一张无分区的数据表,并且表结构必须和分区表相同!!!
而且经本人测试,执行此添加语句,需要设置set hive.exec.dynamic.partiton=true
(开启动态分区)和
set hive.exec.dynamic.partiton.mode=nostrict
(默认strict。至少有一个静态分区)
分桶表:
测试数据
1,tom,11
开启分桶
set hive.enforce.bucketing=true
创建桶
create table psnbucket1 (
id int,
name string,
age int)
clustered by (age) into 4 buckets
row format delimited
fields terminated by ',';
加载数据
insert into table psnbucket select id,name,age from psn31;
抽样
select * from bucket_table tablesample(bucket 1 out of 4 by colimes)
tablesample--------分桶抽样关键字
colimes--------------字段名