選擇分桶字段和計算分桶的正確方法


一、 選出合理的分桶字段。
可以拿 (字段中重復值最多的記錄數/表的總記錄數) 的值作為是否可以作為分桶字段的依據。
    查詢字段中重復值最多的記錄數:
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 ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM