hive之partion静态分区

6.分区表partition
hive中的分区针对{表组织}进行规划的;
【静态分区】:
hive (stocksdb)>create table logs(ts bigint,line string) partitioned by (dt string,country string) row format delimited fields terminated by ‘,’ ;

	hive (stocksdb)> dfs -lsr /user;
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:33 /user/hive/warehouse/stocksdb.db
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:33 /user/hive/warehouse/stocksdb.db/logs 

 
 $>gedit logs.txt
    1231,dflksajflkshfdlksdf
	123132,asjflkafjlkajflkaf
	12131,jkldjflksfdlksfddsf
 加载本地数据
    hive>load data local inpath '/home/crx/Desktop/log.txt' into table logs partition (dt='2020-12-24',country='changchun');
 
 查看表数据
 hive (stocksdb)> select * from logs;
	OK
	1231	dflksajflkshfdlksdf	2019-07-14	changchun
	123132	asjflkafjlkajflkaf	2019-07-14	changchun
	12131	jkldjflksfdlksfddsf	2019-07-14	changchun
	Time taken: 0.261 seconds, Fetched: 3 row(s)

    查看hdfs下表组织
	hive (stocksdb)> dfs -lsr /user; 
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:33 /user/hive/warehouse/stocksdb.db
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08/country=changchun
	-rwxr-xr-x   2 hyxy supergroup         77 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08/country=changchun/logs.txt

 $>gedit logs2.txt
    12,ccc
	32,aaa
	31,ffff
 hive (stocksdb)>load data local inpath '/home/hyxy/Desktop/logs2.txt' into table logs partition (dt='2019-07-14',country='haerbin');
     
 同一天数据下,分别查看不同城市,理解数据仓库的意义
 hive (stocksdb)>select * from stocksdb.logs;
	OK
	1231	dflksajflkshfdlksdf	2019-07-14	changchun
	123132	asjflkafjlkajflkaf	2019-07-14	changchun
	12131	jkldjflksfdlksfddsf	2019-07-14	changchun
	12	    ccc	                2019-07-14	haerbin
	32	    aaa	                2019-07-14	haerbin
	31	    ffff	            2019-07-14	haerbin
    查看表数据的组织情况:
  $>hadoop fs -lsr /user/hive/warehouse
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:33 /user/hive/warehouse/stocksdb.db
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:45 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08/country=changchun
	-rwxr-xr-x   2 hyxy supergroup         77 2019-05-30 11:42 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08/country=changchun/logs.txt
	drwxr-xr-x   - hyxy supergroup          0 2019-05-30 11:45 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08/country=haerbin
	-rwxr-xr-x   2 hyxy supergroup         22 2019-05-30 11:45 /user/hive/warehouse/stocksdb.db/logs/dt=2018-08-08/country=haerbin/logs1.txt
       
   分区列也可用来条件查询,分区列在表结构中
  hive (d2)> desc logs;
			OK
			col_name	data_type	comment
			ts                  	bigint              	                    
			line                	string              	                    
			dt                  	string              	                    
			country             	string              	                    
					 
			# Partition Information	 	 
			# col_name            	data_type           	comment             
					 
			dt                  	string              	                    
			country             	string         

    hive (stocksdb)>select * from stocksdb.logs where country='haerbin';
	OK
	12	ccc	2018-08-08	haerbin
	32	aaa	2018-08-08	haerbin
	31	ffff	2018-08-08	haerbin
	Time taken: 1.051 seconds, Fetched: 3 row(s)
      查看分区:
    hive (stocksdb)> show partitions logs;
	OK
	dt=2018-08-08/country=changchun
	dt=2018-08-08/country=haerbin
	Time taken: 0.113 seconds, Fetched: 2 row(s)

	
    查看hdfs webUI : 50070 
	注意:静态分区的缺点:针对分区列,手动设置,如果分区数据比较多的话,将会较麻烦!
    在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。
	有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。
	分区表指的是在创建表时指定的partition的分区空间。 

    表分区相关元数据:
	1) PARTITIONS:该表存储表分区的基本信息
	2) PARTITIONS_KEYS:该表存储分区的字段信息
	3) PARTITION_KEY_VALS:该表存储分区字段值
    4) PARTITION_PARMS:该表存储分区的属性信息

    总结hive静态分区:
	Hive可以对数据按照某列或者某些列进行分区管理,所谓分区我们可以拿下面的例子进行解释。 
	当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。
	存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的日期列进行划分。
	把每一天的日志当作一个分区。  将数据组织成分区,主要可以提高数据的查询速度。
	至于用户存储的每一条记录到底放到哪个分区,由用户决定。
	即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。 


	1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。 
	2、表和列名不区分大小写。 
	3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,
       但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列) 。 

	案例总结:
	1. 创建一个分区表,以 ds 为分区列: 
	create table invites (id int, name string) partitioned by (ds string) row format delimited fields terminated by '\t' stored as textfile; 
	2. 将数据添加到时间为 2013-08-16 这个分区中: 
        INSERT OVERWRITE/INTO用于将计算的结果保存目标表中。
            insert into:直接向表或表的分区中追加数据。
            insert overwrite:先清空表中的原有数据,再向表或分区中插入数据。
	load data local inpath '/home/hadoop/Desktop/data.txt' overwrite into table invites partition (ds='2013-08-16'); 
	3. 将数据添加到时间为 2013-08-20 这个分区中: 
	load data local inpath '/home/hadoop/Desktop/data.txt' overwrite into table invites partition (ds='2013-08-20'); 
	4. 从一个分区中查询数据: 
	select * from invites where ds ='2013-08-12'; 

	5.  往一个分区表的某一个分区中添加数据: 
	insert overwrite table invites partition (ds='2013-08-12') select id,name from test; 
	可以查看分区的具体情况,使用命令: 
	hadoop fs -ls /home/hadoop.hive/warehouse/invites 
	或者: 
	show partitions tablename;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值