hive 创建、删除、截断表基本操作及相关注意事项

简单的创建表


create table table_name (
id int,
dtDontQuery string,
name string
)

创建有分区的表


create table table_name (
id int,
dtDontQuery string,
name string
)
partitioned by (date string)

一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

在Hive
Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概
念。表中的一个 Partition 对应于表下的一个目录,Partition 就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规
格和条件进行管理。

典型的默认创建表


CREATE TABLE page_view(
viewTime INT,
userid BIGINT,
page_url STRING,
referrer_url STRING,
ip STRING COMMENT ‘IP Address of the User‘)
COMMENT ‘This is the page view table‘
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\001‘
COLLECTION ITEMS TERMINATED BY ‘\002‘
MAP KEYS TERMINATED BY ‘\003‘
STORED AS TEXTFILE;

这里创建了表page_view,有表的注释,一个字段ip的注释,分区有两列,分别是dt和country。

[ROW FORMAT
DELIMITED]关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符。不同列之间用一个‘\001‘分割,集合(例如array,map)的元素之间以‘\002‘隔开,map中key和value用‘\003‘分割。

[STORED AS file_format]关键字是用来设置加载数据的数据类型,默认是TEXTFILE,如果文件数据是纯文本,就是使用 [STORED
AS TEXTFILE],然后从本地直接拷贝到HDFS上,hive直接可以识别数据。

常用的创建表


CREATE TABLE login(
userid BIGINT,
ip STRING,
time BIGINT)
PARTITIONED BY(dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t‘
STORED AS TEXTFILE;

创建外部表


如果数据已经存在HDFS的‘/user/hadoop/warehouse/page_view‘上了,如果想创建表,指向这个路径,就需要创建外部表:


CREATE EXTERNAL TABLE page_view(
viewTime INT,
userid BIGINT,
page_url STRING,
referrer_url STRING,
ip STRING COMMENT ‘IP Address of the User‘,
country STRING COMMENT ‘country of origination‘)
COMMENT ‘This is the staging page view table‘
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\054‘
STORED AS TEXTFILE
LOCATION ‘/user/hadoop/warehouse/page_view‘;

创建表,有指定EXTERNAL就是外部表,没有指定就是内部表,内部表在drop的时候会从HDFS上删除数据,而外部表不会删除。

外部表和内部表一样,都可以有分区,如果指定了分区,那外部表建了之后,还要修改表添加分区。

外部表如果有分区,还可以加载数据,覆盖分区数据,但是外部表删除分区,对应分区的数据不会从HDFS上删除,而内部表会删除分区数据。

指定数据库创建表


如果不指定数据库,hive会把表创建在default数据库下,假设有一个hive的数据库mydb,要创建表到mydb,如下:


CREATE TABLE mydb.pokes(foo INT,bar STRING);

或者是

use mydb; --把当前数据库指向mydb
CREATE TABLE pokes(foo INT,bar STRING);

复制表结构


CREATE TABLE empty_table_name LIKE table_name;

根据table_name创建一个空表empty_table_name,empty_table_name没有任何数据。

create-table-as-selectt
(CTAS)


CTAS创建的表是原子性的,这意味着,该表直到所有的查询结果完成后,其他用户才可以看到完整的查询结果表。

CTAS唯一的限制是目标表,不能是一个有分区的表,也不能是外部表。

简单的方式


CREATE TABLE new_key_value_store
AS
SELECT (key % 1024) new_key, concat(key, value) key_value_pair FROM key_value_store;

复杂的方式


CREATE TABLE new_key_value_store
ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"
STORED AS RCFile AS
SELECT (key % 1024) new_key, concat(key, value) key_value_pair
FROM key_value_store
SORT BY new_key, key_value_pair;

删除表


DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;

删除表会移除表的元数据和数据,而HDFS上的数据,如果配置了Trash,会移到.Trash/Current目录下。

删除外部表时,表中的数据不会被删除。

截断表


TRUNCATE TABLE table_name;
TRUNCATE TABLE table_name PARTITION (dt=‘20080808‘);

从表或者表分区删除所有行,不指定分区,将截断表中的所有分区,也可以一次指定多个分区,截断多个分区。

注意事项:

1、关于数字类型支持的位数

















类型 支持数字位数
tinyint 3位数字
smallint 5位数字
int 10位数字
bigint 19位数字

对于数字类型的存放,如果数字很长,但是对这个字段的值不需要进行计算,个人认为可以就是存放为string。

如果数字字段的值超过了设定的字段类型(例如,存放数字是20位,但是字段设计是bigint),那么,返回结果显示是NULL。

如果数字字段没有值,那么查询返回结果也会显示为NULL。

2、CREATE EXTERNAL TABLE tablename创建,在表建立之后,如果删除该表,数据文件依然是存在。

3、 对于是string类型的字段,在查询后,如果该字段没有值,返回结果集合是看不到NULL的,也就是说,是“”这个值。所以,在取值或查询的时候的时
候,千万记得对string类型的字段进行查询的时候,不要使用<>null或是is not
null这样的描述。应该采用<>“”这样来进行条件过滤。

转载:http://www.cnblogs.com/ggjucheng/archive/2013/01/04/2844393.html

时间: 2024-08-10 14:53:35

hive 创建、删除、截断表基本操作及相关注意事项的相关文章

hive 创建/删除/截断 表(翻译自Hive wiki)

这里罗列常用操作,更多参考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Create%2FDrop%2FTruncateTable 简单的创建表 create table table_name ( id int, dtDontQuery string, name string ) 创建有分区的表 create table table_name ( id int, dtD

Hive创建指向HBase表的表

create [external] table t1(id int, value string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties('hbase.column.mapping'=':key,f:name'); 如果想创建一个指向已经存在的HBase表的话,需要使用external 来自为知笔记(Wiz)

MongoDB 数据库创建删除、表创建删除、数据增删改查

一.管理 mongodb 数据库:mongo 查看所有数据库列 表 show dbs 二. 创建数据库 创建 数据库 use student 如果真的想把这个数据库创建成功,(collections)中插入数 据.不需要专门创建集合,只db.student 系统发现 是一个陌生的集合名字,所以就显示当前的数据集合(中叫表)删除集合,删除指定的集合 1.查询所有记 录 db.userInfo.find(); 相当于:select* from userInfo; 2.查询去掉后 的当前聚集集合中的某

MongoDB 数据库创建删除、表(集合)

一. 数据库使用 开启 mongodb 服务:要管理数据库,必须先开启服务,开启服务使用 mongod --dbpath c:\mongodb 管理 mongodb 数据库:mongo (一定要在新的 cmd 中输入)清屏: cls 查看所有数据库列表 show dbs 二. 创建数据库 使用数据库.创建数据库 use student如果真的想把这个数据库创建成功,那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合(collections)中插入数据.不需要专门创建集合,只 需要写点语

nodejs MongoDB 数据库创建删除、表( 集合)(10)

目录一. 数据库使用............................................................................................................ 1二. 创建数据库............................................................................................................ 2三. 插入(增加)数据.

设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。

表(一)Student (学生表) -- Create table create table STUDENT ( sno VARCHAR2(3) not null, sname VARCHAR2(8) not null, ssex VARCHAR2(2) not null, sbirthday DATE, class VARCHAR2(5) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255; -- Add comments to the

用SQL语句创建四个表并完成相关题目

1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在60到80之间的所有记录 5. 查询Score表中成绩为85,86或88的记录. 6. 查询Student表中“95031”班或性别为“女”的同学记录. 7. 以Class降序查询Student表的所有记录 8. 以Cno升序.Degree降序查询Score表的所有记录. 9. 查询“95031”班

hive与hbase关联表的创建,外表方式

1.在Hive里面创建一个表: hive> create table wyp(id int,    > name string,    > age int,    > tele string)    > ROW FORMAT DELIMITED    > FIELDS TERMINATED BY '\t'    > STORED AS TEXTFILE;OKTime taken: 0.759 seconds 2.这样我们就在Hive里面创建了一张普通的表,现在给这

hive与hbase关联表

关于 hbase 和 hive 关联表 详细介绍: hive 创建 关联hbase表有2种形式: 第一种:hive> create table hive(id string,name string, age int) > stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' > with serdeproperties ("hbase.columns.mapping" = ":key,cf: