一、 選出合理的分桶字段。
可以拿 (字段中重復值最多的記錄數/表的總記錄數) 的值作為是否可以作為分桶字段的依據。
查詢字段中重復值最多的記錄數:
COL_COUNT=select column1,count(1) cnt from table_name group by column1 order by cnt desc limit 1;
查詢表的總記錄數
TOTAL_COUNT=select count(1) from table_name;
如果COL_COUNT/ TOTAL_COUNT的值小於5%,或者COL_COUNT的值在100萬以下,那么該字段可作為分桶字段。
特別的,如果一個表中確實找不到分布均勻的字段作為分桶,可以單獨對表追加一個唯一ID作為分桶字段。
以a)中PIMS_PMART2.TB_FCT_VIP_S_DET_FL_M表為例,通過對該表每個字段做分析發現,custcd 這個字段COL_COUNT= 2114438 ,TOTAL_COUNT=2357030761 ,兩者比值僅為0.09% ,非常適合作為分桶字段。
在所有的字段中,根據字段的設計,優先找一些看起來會是散列分布的字段,執行計算公式,來確定是否適合作為分桶字段。
select cs_order_number, count(1) cnt from test_orc.holo_catalog_sales_orc group by cs_order_number order by cnt desc limit 1; -- 14
select count(1) from test_orc.holo_catalog_sales_orc; -- 2880058
二、 算出合理的分桶數
PIMS_PMART2.TB_FCT_VIP_S_DET_FL_M該表已經存在數據的分區每個分區約60000萬條記錄,TXT格式8000MB。根據2.2.2提到的計算方法,
分桶數=MAX(60000萬/1000萬, 8000M/500M) = 60
為了使數據分布更加均勻,我們一般建議選擇質數作為分桶數。所以該表的最佳分桶數為59或61。
根據數據量,考慮實際的分桶最佳值,此外也要根據計算的時候,需要的task數據量。
CREATE TABLE test_orc.catalog_sales(
cs_sold_date_sk int DEFAULT NULL COMMENT ' ',
cs_sold_time_sk int DEFAULT NULL COMMENT ' ',
cs_ship_date_sk int DEFAULT NULL COMMENT ' ',
cs_bill_customer_sk int DEFAULT NULL COMMENT ' ',
cs_bill_cdemo_sk int DEFAULT NULL COMMENT ' ',
cs_bill_hdemo_sk int DEFAULT NULL COMMENT ' ',
cs_bill_addr_sk int DEFAULT NULL COMMENT ' ',
cs_ship_customer_sk int DEFAULT NULL COMMENT ' ',
cs_ship_cdemo_sk int DEFAULT NULL COMMENT ' ',
cs_ship_hdemo_sk int DEFAULT NULL COMMENT ' ',
cs_ship_addr_sk int DEFAULT NULL COMMENT ' ',
cs_call_center_sk int DEFAULT NULL COMMENT ' ',
cs_catalog_page_sk int DEFAULT NULL COMMENT ' ',
cs_ship_mode_sk int DEFAULT NULL COMMENT ' ',
cs_warehouse_sk int DEFAULT NULL COMMENT ' ',
cs_item_sk int DEFAULT NULL COMMENT ' ',
cs_promo_sk int DEFAULT NULL COMMENT ' ',
cs_order_number int DEFAULT NULL COMMENT ' ',
cs_quantity int DEFAULT NULL COMMENT ' ',
cs_wholesale_cost float DEFAULT NULL COMMENT ' ',
cs_list_price float DEFAULT NULL COMMENT ' ',
cs_sales_price float DEFAULT NULL COMMENT ' ',
cs_ext_discount_amt float DEFAULT NULL COMMENT ' ',
cs_ext_sales_price float DEFAULT NULL COMMENT ' ',
cs_ext_wholesale_cost float DEFAULT NULL COMMENT ' ',
cs_ext_list_price float DEFAULT NULL COMMENT ' ',
cs_ext_tax float DEFAULT NULL COMMENT ' ',
cs_coupon_amt float DEFAULT NULL COMMENT ' ',
cs_ext_ship_cost float DEFAULT NULL COMMENT ' ',
cs_net_paid float DEFAULT NULL COMMENT ' ',
cs_net_paid_inc_tax float DEFAULT NULL COMMENT ' ',
cs_net_paid_inc_ship float DEFAULT NULL COMMENT ' ',
cs_net_paid_inc_ship_tax float DEFAULT NULL COMMENT ' ',
cs_net_profit float DEFAULT NULL COMMENT ' '
)
clustered by (cs_order_number) into 5 buckets
stored as orc ;