hive中的表操作

导入数据:

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<string>,
address map<string,string>
)
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-----一定是一张内部表

Hive 分区partition

必须在表定义时指定对应的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<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 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--------------字段名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值