hive分区表

1.分区表

  假如有一日志文件,其中每条记录都包含一个时间戳。我们根据日期来对他进行分区,那么同一天的记录就会被存放在同一个分区中。

  • 为避免产生过多小文件,建议只对离散字段分区。
  • 使用分区并不会影响大范围查询的执行,仍然可以跨分区查询。
  • 分区实质:在数据表文件夹下再次创建分区文件夹

2.子分区

  在日期分区的基础上,还可以根据国家对每个分区进行子分区,以加快根据地理位置的查询。

  子分区的实质:在分区目录下创建子分区目录。

  分区在创建表时用partitioned by定义,创建表后可以使用alter table语句来增加或移除分区。

create table logs (ts bigint,line string)
 partitioned by (dt string,country string)
 Row Format Delimited Fields Terminated By ‘\t’ ;

   Load数据时,显示指定分区值:

load data local inpath ‘/root/hive/file2‘
 into table logs
 partition (dt=‘2001-01-01‘,country=‘GB‘);

  更多数据文件加载到logs表之后,目录结构:

  日志表中:两个日期分区 + 两个国家分区。数据文件则存放在底层目录中。

/user/hive/warehouse/logs /dt=2010-01-01/country=GB/file1
/file2

/country=US/file3

/dt=2010-01-02/country=GB/file4

/country=US/file5
  /file6

  使用show partitions logs命令获得logs表中有那些分区:

dt=2001-01-01/country=GB

dt=2001-01-01/country=US

dt=2001-01-02/country=GB

dt=2001-01-02/country=US

  显示表的结构信息:Describe logs;

ts                      bigint
line                    string
dt                      string
country                 string                                

# Partition Information          

# col_name              data_type               comment                         

dt                          string
country                     string 
  • 需要注意,Partitioned by子句中的列定义是表中正式的列,称为“分区列”partition column。
  • 但是,数据文件并不包含这些列的值,因为他们源于目录名。
  • 可以在select语句中以普通方式使用分区列。Hive会对输入进行修剪,从而只扫描相关的分区。
select ts,dt,line
 from logs
 where country=‘GB‘;

  将只扫描file1,file2,file4。

  • 还要注意,这个查询返回dt分区列的值。这个值是Hive从目录名中读取。
时间: 2024-11-10 16:08:59

hive分区表的相关文章

[Hive]MapReduce将数据写入Hive分区表

业务需求: 将当天产生的数据写入Hive分区表中(以日期作为分区) 业务分析: 利用MapReduce将数据写入Hive表实则上就是将数据写入至Hive表的HDFS目录下,但是问题在于写入至当天的分区,因此问题转换为:如何事先创建Hive表的当天分区 解决方案: 1. 创建Hive表 # 先创建分区表rcmd_valid_path hive -e "set mapred.job.queue.name=pms; drop table if exists pms.test_rcmd_valid_pa

通过表名和时间查看hive分区表的数据

[linux-]$  /home/script/listHive.py  ta_name_1002_user_search_log_day  20180626 #!/usr/bin/env python # -*- coding: utf-8 -*- ########################################## # 通过表名和时间查看hive分区表的数据 # len(sys.argv)--输入参数个数 # sys.argv[1] -- 表名 # sys.argv[2] -

Hive分区表创建,增加及删除

1.创建Hive分区表,按字段分区 CREATE TABLE test1 ( id bigint , create_time timestamp , user_id string) partitioned by (partition_key int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\n'; 2.增加Hive分区表 ALTER TABLE test1 ADD PARTITION(parti

Hive分区表的导入与导出

最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中.毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容.如果哪里有错误或者疏漏,希望各位网友能够指出. 第一篇:HDFS的上传与下载:https://www.cnblogs.com/BlackString/p/10552553.html 第二篇:Hive中数据的导入与导出:https://www.cnblogs.com/BlackString/p/10552806.html

hive分区表实践

HIVE把表组织成"分区",这是一种根据"分区列"的值对表进行粗略划分的机制,使用分区可以加快数据分片的查询速度. 表或分区可以进一步分为"桶".它会为数据提供额外的结构以获得更高效的查询处理. 创建分区表 CREATE TABLE bills_detail (msgid STRING,time STRING,spid STRING,opid STRING,spcode STRING,result STRING)  PARTITIONED BY 

hive中导入json格式的数据(hive分区表)

hive中建立外部分区表,外部数据格式是json的如何导入呢? json格式的数据表不必含有分区字段,只需要在hdfs目录结构中体现出分区就可以了 This is all according to this guide: http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/ 1 hive> ADD JAR /home/hadoop/hive-serdes-1.0-SNAPSHOT.jar; 2 Added

Hive分区表与分桶

分区表 在Hive Select查询中,一般会扫描整个表内容,会消耗很多时间做没必要的工作. 分区表指的是在创建表时,指定partition的分区空间. 分区语法 create table tablename name string ) partitioned by(key type,-) create table if not exists employees( name string, salary string, subordinates array<string>, deduction

hive 分区表、桶表和外部表

1:分区表 图:创建分区表 图:导入数据 图:在HDFS的显示信息 分区字段就是一个文件夹的标识 图:在多列上创建分区 图:导入数据 图:在多列上建立分区后在HDFS上形成的结构信息 把表中的大多数字段建立为分区字段,可行吗?分区不是越多越好,分区越多的话,加载数据的话必须注意分区,那么文件会被控制的非常小,Map的任务数量增多, 计算不一定会快.Hive限定了分区的数量.选用一些查询比较频繁的字段来建立分区,时间字段等. 查询比较频繁,并且不会有很多枚举值的字段,适合作为分区字段.分区字段就是

Hive分区表动态添加字段

场景描述: 公司埋点项目,数据从接口服务写入kafka集群,再从kafka集群消费写入HDFS文件系统,最后通过Hive进行查询输出.这其中存在一个问题就是:埋点接口中的数据字段是变化,后续会有少量字段添加进来.这导致Hive表结构也需要跟着变化,否则无法通过Hive查询到最新添加字段的数据. 解决办法: 为数据表添加字段,字段必须添加到已有字段的最后面.因为已经存在的数据是按照之前的表结构写入到HDFS文件中的,当添加新字段时为了能兼容前面已经存在的数据.在新增的字段加到分区表后,之前已经存在