分區 & 分桶
都是把數據划分成塊。分區是粗粒度的划分,桶是細粒度的划分,這樣做為了可以讓查詢發生在小范圍的數據上以提高效率。
- 分區之后,分區列都成了文件目錄,從而查詢時定位到文件目錄,子數據集而提高查詢效率。

- 桶
- 創建:
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 這樣。(具體需深入)

