Hive 7、Hive 的内表、外表、分区(22)

Hive 7、Hive 的内表、外表、分区

1、Hive的内表

Hive 的内表,就是正常创建的表,在 http://www.cnblogs.com/raphael5200/p/5208437.html 中已经提到;

2、Hive的外表

创建Hive 的外表,需要使用关键字 External:

CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name data_type [COMMENT col_comment], ...)]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 

下面看一个例子:

create External table food_ex
(
id int,
name string,
category string,
price double
)
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ‘\t‘
 lines terminated by ‘\n‘; 

-- 加载数据load data local inpath ‘/opt/food.txt‘ overwrite into table food_ex;
select * from food_ex;

这两个,左边是外表,右边是内表从大体上看似乎没什么区别,但是他的主要区别在于删除操作上:

  内表删除表或者分区元数据和数据都删了

  外表删除表元数据删除,数据保留

下面分别执行两条语句:

 drop table food;
 drop table food_ex;

执行这两条语句以后,两个表都删除了,但是结果却不一样,访问NameNode的50070端口:

可以看到,虽然都执行了表删除语句,内表删除后是把元数据和数据都删除了,而外表却只删除了元数据(表的信息)但真实数据却保留了下来;

3、Hive的分区partition

必须在表定义时创建partition

a、单分区建表语句:

create table day_table (id int, content string)partitioned by (dt string);

单分区表,按天分区,在表结构中存在id,content,dt三列。 以dt为文件夹区分

例:

 create table log_info
 (
 ip string
 )
 PARTITIONED BY(times string)
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ‘\t‘
 lines terminated by ‘\n‘; 

# 下面是log_info 的表结构信息,分区已经创建hive> desc log_info;
OK
ip                      string
times                   string                                      

# Partition Information
# col_name                data_type               comment             

times                   string
Time taken: 0.077 seconds, Fetched: 7 row(s)

b、 双分区建表语句:

create table day_hour_table (id int, content string) partitioned by (dt string, hour string);

双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。 先以dt为文件夹,再以hour子文件夹区分

 create table log_info2
 (
 ip string
 )
 PARTITIONED BY(days string,hours string)
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ‘\t‘
 lines terminated by ‘\n‘; 

# 下面是log_info2 的表结构信息,分区已经创建
hive> desc log_info2;
OK
ip                      string
days                    string
hours                   string                                      

# Partition Information
# col_name                data_type               comment             

days                    string
hours                   string
Time taken: 0.08 seconds, Fetched: 9 row(s)

c、Hive添加分区表语法 (表已创建,在此基础上添加分区):

ALTER TABLE table_name ADDpartition_spec
 [ LOCATION ‘location1‘ ]
partition_spec [ LOCATION ‘location2‘ ] ...
ALTER TABLE day_table
ADDPARTITION (dt=‘2008-08-08‘, hour=‘08‘)
location ‘/path/pv1.txt‘

d、Hive删除分区语法:

ALTER TABLE table_name DROP PARTITION partition_spec, partition_spec,...

用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。例:

ALTER TABLE day_hour_table DROP PARTITION (dt=‘2008-08-08‘, hour=‘09‘);
alter table log_info drop partition (times=‘20160222‘);

e、Hive数据加载进分区表中语法:

 LOAD DATA [LOCAL] INPATH ‘filepath‘ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] 

例:

单分区数据加载

 load data local inpath ‘/opt/log‘ overwrite into table  log_info partition(times=‘20160223‘); load data local inpath ‘/opt/log2‘ overwrite into table log_info partition(times=‘20160222‘);

hive> select * from log_info;
OK
23.45.66.77 20160222
45.66.11.8
20160222
2.3.4.5 20160223
4.56.77.31 20160223
34.55.6.77
20160223
34.66.11.6 20160223
Time taken: 0.125 seconds, Fetched: 6
row(s)

在Hive中会根据分区的名称新建两个分区目录

双分区数据加载

load data local inpath ‘/opt/log3‘ overwrite into table log_info2 partition(days=‘23‘,hours=‘12‘);

hive> select * from log_info2;
OK
12.3.33.66    23    12
23.44.56.6    23    12
12.22.33.4    23    12
8.78.99.4    23    12
233.23.211.2    23    12
Time taken: 0.069 seconds, Fetched: 5 row(s)

当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录 基于分区的查询的语句:

SELECT day_table.* FROM day_table WHERE day_table.dt>= ‘2008-08-08‘;

f、Hive查看分区语句: 

hive> show partitions day_hour_table; OK dt=2008-08-08/hour=08 dt=2008-08-08/hour=09 dt=2008-08-09/hour=09
hive> show partitions log_info;
OK
times=20160222
times=20160223
Time taken: 0.06 seconds, Fetched: 2 row(s)
时间: 2024-10-11 05:27:40

Hive 7、Hive 的内表、外表、分区(22)的相关文章

分析Hive表和分区的统计信息(Statistics)

类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占存储大小.最后一次操作时间等: 新表的统计信息 对于一个新创建的表,默认情况下,如果通过INSERT OVERWRITE的方式插入数据,那么Hive会自动将该表或分区的统计信息更新到元数据. 有一个参数来控制是否自动统计,hive.stats.autogather,默认为true. 举例来说: 先创

Hive 官方手册翻译 -- Hive Transactions (Hive 事务)

由 Alan Gates创建, 最终由 Andrew Sherman修改于2018年8月7日 原文链接:https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions 翻译:Google Google翻译,金山软件 金山词霸 校对:南大通用 范振勇 (如有翻译问题,请多指教) 一.Hive 3的警告 升级到Hive 3.0时,由之前版本创建的任何事务性表都需要在每个分区上运行Major(主要/深度)级紧缩操作.更确切地说,自上

Hive 7、Hive 的内表、外表、分区

1.Hive的内表 Hive 的内表,就是正常创建的表,在 http://www.cnblogs.com/raphael5200/p/5208437.html 中已经提到: 2.Hive的外表 创建Hive 的外表,需要使用关键字 External: CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_

Hive表的分区与分桶

1.Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作.Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率. 创建分区表的语法: [java] view plain copy create table tablename( name string )partitioned by(key,type...); 示例 [java] view plain copy drop table if exists emp

hive中的表、外部表、分区和桶的理解

一.概念介绍 Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据 Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据.例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.wareh

Hive Experiment 2(表动态分区和IDE)

1.使用oracle sql developer 4.0.3作为hive query的IDE. 下载hive-jdbc driver http://www.cloudera.com/content/cloudera/en/downloads/connectors/hive/jdbc/hive-jdbc-v2-5-6.html Start    Oracle    SQL    Developer    and    navigate    to    Preferences    |    Da

HIve通过mysql元数据表删除分区

1 创建表 hive命令行操作 CREATE TABLE IF NOT EXISTS emp( name STRING, salary FLOAT, subordinates ARRAY<STRING>, deductions MAP<STRING,FLOAT>, address STRUCT<street:STRING,city:STRING,province:STRING,zip:INT> ) PARTITIONED BY (province STRING,city

创建Hive/hbase相关联的表异常

hive> CREATE TABLE hperson(id string, name string,email string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":id,cf1:name,cf2:email") TBLPROPERTIES ("hbase.table.

hadoop笔记之Hive的数据存储(桶表)

Hive的数据存储(桶表) Hive的数据存储(桶表) 桶表 桶表是对数据进行哈希取值,然后放到不同文件中存储. 比如说,创建三个桶,而创建桶的原则可以按照左边表中学生的名字来创建对应的桶.这样子把左边的数据存到桶里面来的时候可以把学生名字经过哈希运算,把相同哈希运算的值的列存放在同一个桶当中.比如Tom.Jerry.Scott经运算以后它们的哈希值是一样的,那么这三个人的信息就会存放在相同的一个桶里面. 有了桶表以后,就能够降低系统的文件块,从而提高查询速度 ○ 如何创建桶表?(用名字进行创建