<font id="tbtdb"></font>

        <sub id="tbtdb"><delect id="tbtdb"></delect></sub>

          <progress id="tbtdb"></progress>
          <address id="tbtdb"></address><thead id="tbtdb"></thead>
          <font id="tbtdb"></font>

          <meter id="tbtdb"><cite id="tbtdb"><dl id="tbtdb"></dl></cite></meter>

          好程序員-千鋒教育旗下高端IT職業教育品牌

          400-811-9990
          我的賬戶
          好程序員

          專注高端IT職業培訓

          親愛的猿猿,歡迎!

          已有賬號,請

          如尚未注冊?

          [BigData] 好程序員大數據培訓教程分享hive分區和分桶

          [復制鏈接]
          733 0
          葉子老師 發表于 2019-8-20 14:21:17 | 只看該作者 |閱讀模式 打印 上一主題 下一主題
          好程序員大數據培訓教程分享hive分區和分桶,hive 分區
          1.為什么要分區??
          當單個表數據量越來越大的時候,hive查詢通常會全表掃描,這將會浪費我們不關心數據的掃描,浪費大量時間。從而hive引出分區概念partition
          2.怎么分區??
          看具體業務,能把一堆數據拆分成多個堆的數據就可以。 通常使用id 、 年 、 月 、天 、區域 、省份、 hive分區和mysql分區的區別?? mysql的分區字段采用的表內字段。 hive的分區字段使用的是表外字段。
          3.hive分區細節??
          1、分區本質是在該表下創建對應的目錄。 2、分區名大小寫不區分,建議不要使用中文。 3、可以查詢分區信息。但是我們的分區字段相當于是一個偽字段,在元數據中存在,但是不真實存在數據內容中。
          4、加載數據時要指定分區
          4.分區操作
          創建一級分區表:
          create table if not exists day_part(
          uid int,
          uname string
          )
          partitioned by(year int)
          row format delimited fields terminated by '\t'
          ;
          load data local inpath '/root/Desktop/student.txt' into table day_part partition(year=2017);
          load data local inpath '/root/Desktop/score.txt' into table day_part partition(year=2016);
          show partitions day_part;
          二級分區
          create table if not exists day_part1(
          uid int,
          uname string
          )
          partitioned by(year int,month int)
          row format delimited fields terminated by '\t'
          ;
          load data local inpath '/root/Desktop/student.txt' into table day_part1 partition(year=2017,month=04);
          load data local inpath '/root/Desktop/score.txt' into table day_part1 partition(year=2017,month=03);
          三級分區:
          create table if not exists day_part2(
          uid int,
          uname string
          )
          partitioned by(year int,month int,day int)
          row format delimited fields terminated by '\t'
          ;
          對分區進行操作: 顯示分區:
          show partitions day_part;
          新增分區:空的
          alter table day_part1 add partition(year=2017,month=2);
          alter table day_part1 add partition(year=2017,month=1) partition(year=2016,month=12);
          新增分區并加載數據:
          alter table day_part1 add partition(year=2016,month=11) location "/user/hive/warehouse/qf1603.db/day_part1/year=2017/month=2";
          修改分區所對應的存儲路徑:
          ##路徑必須從hdfs寫起
          alter table day_part1 partition(year=2016,month=11) set location "hdfs://linux1:9000/user/hive/warehouse/qf1603.db/day_part1/year=2017/month=3";
          刪除分區:刪除分區將會刪除對應的分區目錄(數據)
          ##刪除某個分區
          alter table day_part1 drop partition(year=2017,month=2);
          ##刪除多個
          alter table day_part1 drop partition(year=2017,month=3),partition(year=2017,month=4);
          靜態分區、動態分區、混合分區 靜態分區:新增分區或者是加載分區數據時,已經指定分區名。 動態分區:新增分區或者是加載分區數據時,分區名未知。 混合分區:靜態分區和動態分區同時存在。
          動態分區的相關屬性: hive.exec.dynamic.partition=true :是否允許動態分區 hive.exec.dynamic.partition.mode=strict :分區模式設置nostrict strict:最少需要有一個是靜態分區 nostrict:可以全部是動態分區 hive.exec.max.dynamic.partitions=1000 :允許動態分區的最大數量 hive.exec.max.dynamic.partitions.pernode =100 :單個節點上的mapper/reducer允許創建的最大分區
          創建臨時表:
          ##創建臨時表
          create table if not exists tmp(
          uid int,
          commentid bigint,
          recommentid bigint,
          year int,
          month int,
          day int
          )
          row format delimited fields terminated by '\t';
          ##加載數據
          load data local inpath '/root/Desktop/comm' into table tmp;
          創建動態分區:
          ##創建動態分區表
          create table if not exists dyp1(
          uid int,
          commentid bigint,
          recommentid bigint
          )
          partitioned by(year int,month int,day int)
          row format delimited fields terminated by '\t'
          ;
          為動態分區加載數據:
          ##嚴格模式
          insert into table dyp1 partition(year=2016,month,day)
          select uid,commentid,recommentid,month,day from tmp;
          ##非嚴格模式
          ##設置非嚴格模式動態分區
          set hive.exec.dynamic.partition.mode=nostrict;
          ##創建動態分區表
          create table if not exists dyp2(
          uid int,
          commentid bigint,
          recommentid bigint
          )
          partitioned by(year int,month int,day int)
          row format delimited fields terminated by '\t';
          ##為非嚴格模式動態分區加載數據
          insert into table dyp2 partition(year,month,day)
          select uid,commentid,recommentid,year,month,day from tmp;
          hive提供我們一個嚴格模式:為了阻止用戶不小心提交惡意hql hive.mapred.mode=nostrict : strict
          如果該模式值為strict,將會阻止以下三種查詢: 1、對分區表查詢,where中過濾字段不是分區字段。 2、笛卡爾積join查詢,join查詢語句,不帶on條件 或者 where條件。
          select
          stu.id,
          stu.name,
          score.grade
          from student stu
          join score
          ;
          可以:
          select
          stu.id,
          stu.name,
          score.grade
          from student stu
          join score
          where stu.id = score.uid
          ;
          3、對order by查詢,有order by的查詢不帶limit語句。
          select
          student.*
          from student
          order by student.id desc
          ;
          注意: 1、盡量不要是用動態分區,因為動態分區的時候,將會為每一個分區分配reducer數量,當分區數量多的時候,reducer數量將會增加,對服務器是一種災難。 2、動態分區和靜態分區的區別,靜態分區不管有沒有數據都將會創建該分區,動態分區是有結果集將創建,否則不創建。 3、hive動態分區的嚴格模式和hive提供的hive.mapred.mode的嚴格模式。
          分桶1.為什么要分桶??
          分區數據依然很大,對分區數據或者表數據更加細粒度的管理。 分桶關鍵字: clustered by(uid) into n buckets 、bucket 、 分桶使用表內字段 怎么分桶?? 對分桶字段進行hash值,然后將hash值模于總的桶數,然后得到桶數
          2.分桶的意義:
          1、快速抽樣查詢。tablesample 2、減少查詢掃描數據量,提高查詢效率。
          ##創建分桶表,設置4個分桶
          create table if not exists bucket1(
          uid int,
          uname String
          )
          clustered by(uid) into 4 buckets
          row format delimited fields terminated by '\t'
          ;
          3.分桶的操作:
          為分桶表加載數據: 分桶不能使用load方式來加載數據,而需要iinsert into方式來加載 并且需要設置屬性:
          ##設置分桶啟用
          hive> set hive.enforce.bucketing=true;
          ##錯誤的加載數據方式
          load data local inpath '/root/Desktop/student' into table bucket1;
          ##創建分桶表,設置4個分桶
          create table if not exists bucket7(
          uid int,
          uname String
          )
          clustered by(uid) into 4 buckets
          row format delimited fields terminated by '\t'
          ;
          ##為分桶表加載數據
          insert into table bucket7
          select id,name from student
          ;
          分桶查詢:tablesample(bucket x out of y on uid) 注意:x不能大于y x:所取桶的起始位置, y:所取桶的總數,y是總桶數的因子。y大于源總桶數相當于拉伸,y小于源總桶數相當于壓縮 1 out of 2 1 1+4/2 2 out of 2 2 2+4/2
          1 out of 4 1 1+4
          select * from bucket7;
          select * from bucket7 tablesample(bucket 1 out of 4 on uid);
          select * from bucket7 tablesample(bucket 2 out of 4 on uid);
          select * from bucket7 tablesample(bucket 1 out of 2 on uid);
          select * from bucket7 tablesample(bucket 2 out of 2 on uid);
          select * from bucket7 tablesample(bucket 3 out of 2 on uid);
          select * from bucket7 tablesample(bucket 1 out of 8 on uid);
          select * from bucket7 tablesample(bucket 5 out of 8 on uid);
          分區+分桶:(qfstu) uid,uname,class,master gender分區 分桶uid 基偶分桶 查詢女生中的學號為基數??
          ##創建表
          create table if not exists qftmp(
          uid int,
          uname string,
          class int,
          gender int)
          row format delimited fields terminated by '\t';
          ##加載數據
          load data local inpath '/home/qf' into table qftmp;
          ##創建動態分區分桶表
          create table if not exists qf(
          uid int,
          uname string,
          class int)
          partitioned by(gender int)
          clustered by(uid) into 2 buckets
          row format delimited fields terminated by '\t';
          ##為動態分區分桶表加載數據
          insert into table qf partition(gender)
          select uid,uname,class,gender from qftmp;
          查詢女生中的學號為基數?????
          select * from qf where gender = 2 and uid%2 != 0;
          select * from qf tablesample(bucket 2 out of 2 on uid) where gender = 2;
          分桶使用內部關鍵字,分區使用的是外部字段。 兩者都是對hive的一個優化。 分區和分桶的數量都要合理設置,不是越多越好。
          抽樣:
          select * from student order by rand() limit 3;
          select * from student limit 3;
          select * from student tablesample(3 rows);
          select * from student tablesample(20B); ##最小單位是B
          select * from student tablesample(20 percent);##百分比
          好程序員大數據培訓官網:http://www.xn122.com/

          精彩內容,一鍵分享給更多人!
          收藏
          收藏0
          轉播
          轉播
          分享
          淘帖0
          支持
          支持0
          反對
          反對0
          回復

          使用道具 舉報

          您需要登錄后才可以回帖

          本版積分規則

          關注我們
          好程序員
          千鋒好程序員

          北京校區(總部):北京市海淀區寶盛北里西區28號中關村智誠科創大廈

          深圳西部硅谷校區:深圳市寶安區寶安大道5010號深圳西部硅谷B座A區605-619

          杭州龍馳智慧谷校區:浙江省杭州市下沙經濟技術開發區元成路199號龍馳智慧谷B座7層

          鄭州校區:鄭州市二七區航海中路60號海為科技園C區10層、12層

          Copyright 2007-2019 北京千鋒互聯科技有限公司 .All Right

          京ICP備12003911號-5 京公安網11010802011455號

          請您保持通訊暢通1對1咨詢馬上開啟

          电影韩国三级2019在线观看