Hive 的分桶 & Parquet 概念

分区 & 分桶

都是把数据划分成块。分区是粗粒度的划分,桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。

  • 分区之后,分区列都成了文件目录,从而查询时定位到文件目录,子数据集而提高查询效率。

  1. 创建:
create table zyy_table (id int,name string)
clustered by (id) into 4 buckets;

     clustered by (...) into (...)  buckets  声明分桶列和桶的个数。

     hive会计算记录的哈希值,对桶的个数取模,来决定记录属于哪个桶 。

set hive.enforce.bucketing=true –- 必须设置这个数据,hive才会按照你设置的桶的个数去生成数据

     hive> dfs -ls /user/hive/warehouse/zyy_table;    -- 可以查询桶文件

drwxrwxr-x+  1 hive hive        111 2016-07-28 19:30 /user/hive/warehouse/test.db/zyy_table/000000_0
drwxrwxr-x+  2 hive hive        120 2016-07-28 19:41 /user/hive/warehouse/test.db/zyy_table/000000_1
-rwxrwxr-x+  3 hive hive        148 2016-07-28 19:41 /user/hive/warehouse/test.db/zyy_table/000000_2

    对示例数据进行查询:

— 带桶的表
select * from zyy_table tablesample(bucket 1 out of 4 on id);

tablesample 可以让查询发生在一部分桶上,而不是普通表的查询(使用rand() 函数,在整个数据集上检索)

parquet  

http://www.infoq.com/cn/articles/in-depth-analysis-of-parquet-column-storage-format/

面向分析型业务的列式存储格式。

列式存储相比于行式存储的优势:

1. 可以跳过不符合条件的数据,降低IO

2. 压缩编码,节省空间。同一列数据类型一样,可以高效压缩。

3. 只读取需要的列,支持向量运算,扫描更有效率。

Parquet的优势:

日志结构是复杂的嵌套数据类型,而不同的计算框架需要对这些数据做分析和挖掘,存储和访问很重要。paquet就是既支持关系型数据类型,又能支持嵌套类型的存储格式,

同时适配多种数据处理框架(MapReduce, Hive, Pig)。

关系型数据的列式存储很简单,一列列排列下来;

嵌套型的列存储有些复杂。一个record中的column可以是Int Long,String 也可以是List, Map,Set 这样。(具体需深入)

原文地址:https://www.cnblogs.com/skyEva/p/5716062.html