pypark hive 开启动态分区_Hive数据过滤之分区和分桶

点击关注上方“知了小巷”,

设为“置顶或星标”,第一时间送达干货。

Hive数据过滤之分区和分桶

hadoop-3.1.1
hive-3.1.1

Hive表:

hive> desc emp;
OK
empno                int                                      
ename                varchar(10)                              
job                  varchar(9)                               
mgr                  int                                      
hiredate             date                                     
sal                  float                                    
comm                 float                                    
deptno               int                                      
Time taken: 0.313 seconds, Fetched: 8 row(s)

Hive中的数据过滤

  1. where子句过滤
  2. having子句过滤
  3. distinct子句过滤
  4. 表过滤
  5. 分区过滤
  6. 分桶过滤
  7. 索引过滤
  8. 列过滤

分区过滤

为什么要分区

hive为了避免全表查询,引进分区,将数据按目录进行划分,查询时指定目录,就可以减少查询时扫描的数据集规模,从而减少不必要的查询,提高查询效率。

Hive分区 VS MySQL分区

MySQL的分区字段用的是表内字段,hive的分区字段采用表外字段,也就是使用伪字段,分区字段在创建表的时候指定。

Hive中的动态分区

-- 是否允许动态分区

HiveSQL分区过滤使用方式

HiveSQL分区过滤是在where子句后面新增分区列的筛选条件。普通where子句的过滤是在Map阶段或者直接Fetch,增加判断条件用来剔除不满足条件的数据行,分区列的筛选是在Map的上一个阶段,在数据输入阶段进行路径的过滤。

Hive分区实际上是在分布式文件系统中以目录形式存在,一个分区对应一个目录。分区表在HDFS中的表现形式:

$ hdfs dfs -ls /user/hive/warehouse/dept_partition
Found 3 items
drwxr-xr-x   - shaozhipeng supergroup          0 2020-05-24 17:48 /user/hive/warehouse/dept_partition/month=202005
drwxr-xr-x   - shaozhipeng supergroup          0 2020-05-24 17:54 /user/hive/warehouse/dept_partition/month=202006
drwxr-xr-x   - shaozhipeng supergroup          0 2020-05-24 17:55 /user/hive/warehouse/dept_partition/month=202007

MapReduce设置数据文件路径的方式:

@Test

分桶过滤

分桶是对列值取哈希值的方式,将不同数据放到不同文件中存储。对于hive中每一个表、分区都可以进一步进行分桶。

列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。

分桶适用场景:数据抽样( sampling )、map-join

分区是对目录的过滤,分桶是对文件的过滤

每个记录存储到桶的算法:
数据记录存储的桶 = mod(hash(分桶列的值), 桶个数)

Hive会将mod后计算出来一样结果的数据放在一起,如果查询数据的时候,条件中带有分桶字段的列,就会直接定位到相应的文件,避免扫描所有文件块,对于有上万、几十万文件的大表来说,可以极大缩短读取数据的时间,也方便在Map端进行join操作。

分桶表长这样:

hive> desc formatted stu_buck;
OK
# col_name             data_type            comment             
id                   int                                      
name                 string                                   
    
# Detailed Table Information    
Database:            default               
OwnerType:           USER                  
Owner:               shaozhipeng           
CreateTime:          Mon May 25 22:20:54 CST 2020  
LastAccessTime:      UNKNOWN               
Retention:           0                     
Location:            hdfs://localhost/user/hive/warehouse/stu_buck  
Table Type:          MANAGED_TABLE         
Table Parameters:    
 COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\"}
 bucketing_version    2  
  # 文件数量
 numFiles             4                   
 numRows              19                  
 rawDataSize          159                 
 totalSize            178                 
 transient_lastDdlTime 1590417784          
    
# Storage Information    
SerDe Library:       org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
InputFormat:         org.apache.hadoop.mapred.TextInputFormat  
OutputFormat:        org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  
Compressed:          No                    
Num Buckets:         4                     
Bucket Columns:      [id]                  
Sort Columns:        []                    
Storage Desc Params:    
 field.delim          \t                  
 serialization.format \t                  
Time taken: 0.296 seconds, Fetched: 33 row(s)

值得注意的是:
hive.enforce.bucketing这个参数已经默认为true了。
Configuration Properties#hive.enforce.bucketing (Hive 0.x and 1.x only)

hive.enforce.bucketing
Default Value:
Hive 0.x: false
Hive 1.x: false
Hive 2.x: removed, which effectively makes it always true (HIVE-12331)
Added In: Hive 0.6.0
Whether bucketing is enforced. If true, while inserting into the table, bucketing is enforced.

往期精选

Hive数据过滤之表过滤

Hive数据过滤之distinct子句

Hive数据过滤之having子句

Hive数据过滤之where子句

Apache Kafka生产环境集群资源规划与配置

入门Apache Kafka需要了解的方方面面

6baab2ba1559bf00e43e10d718c08ce7.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值