Java基礎——TCP通訊程式
阿新 • • 發佈:2022-04-20
分割槽表:
create table fzname_p ( id int, name string, age int, tel string ) PARTITIONED BY (month string) ---指定分割槽 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
分割槽:
PARTITIONED :表示的是分割槽,不同的分割槽會以資料夾的形式存在
建立分割槽表:
(1) 可以把資料分開儲存在不同的資料夾下
(2) 分割槽的規則,也就是按照那個欄位的值進行分割槽
(3) 對於查詢,起到優化的作用,查詢某個分割槽的資料會比較快
1、建立分割槽表
--【例1】把員工資訊按照員工"所屬部門"分開儲存到不同的分割槽裡面(也就是子資料夾)中 drop table IF EXISTS mydb.emp_dept_p;--如果存在就刪掉 create table mydb.emp_dept_p ( empno int, ename string ) PARTITIONED BY (deptno int); --同步資料到分割槽表中(10、20、30、40) insert overwrite table mydb.emp_dept_p partition(deptno=10) select e.empno, e.ename frommydb.emp e where e.deptno=20; 和oracle差異 1. 建表的時候 oracle 要指定分割槽,oralce 不用 2. hive的分割槽欄位,不在建表語句當中,需要有型別 3. 插入資料時,hive 需要指定分割槽的值 select * from emp_dept_p where deptno=10 ---建立員工表,empno,ename,按照 job 來建立分割槽表emp_job_p。並且把 SALESMAN 的資料插入到 emp_job_p表中的 SALESMAN 分割槽。
2.動態分割槽
--設定動態分割槽
--開啟動態分割槽
set hive.exec.dynamic.partition=true;
--設定動態分割槽的模式
set hive.exec.dynamic.partition.mode=nonstrict;
exec ---execute
dynamic ---動態
strict --嚴格的 ---第一個分割槽必須是靜態的,必須指定它值,動態分割槽(不指定值)只能放在第二個
nonstrict --第一個分割槽可以是 動態的(不指定值)
-------------動態分割槽 ---向分割槽表中插入資料時,只指定欄位,不指定值。值從表中的最後一個欄位中獲取。 CREATE TABLE mydb.emp_par2( empno INT, ename STRING, job STRING, mgr INT, sal DOUBLE, comm DOUBLE, deptno INT ) PARTITIONED BY (hiredate STRING) ---動態分割槽 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; --裝載資料 INSERT INTO mydb.emp_par2 PARTITION (hiredate) SELECT empno, ename, job, mgr, sal, comm, deptno, hiredate ---動態分割槽 from mydb.emp;
注意:
1 動態分割槽在裝載資料的時候,分割槽欄位要放在查詢的最後一位,這樣才能識別到分割槽欄位
2 建立分割槽表的時候,分割槽欄位不要出現在建立表的欄位裡面
----檢視分割槽
show partitions 表名;
--桶表(瞭解)
在分割槽數量過於龐大以至於可能導致檔案系統崩潰時,我們就需要使用分桶來解決問題了。
與分割槽的區別,分割槽錶針對是目錄,也就是儲存路徑,分桶表,則針對的是檔案,把檔案分成多個小檔案,粒度更細。
1 在Hive分割槽表中,分割槽中的資料過於龐大,建議使用桶表
2 在分桶的時候,對指定的欄位取hash值,並且使用這個hash值對桶的個數取餘來進行分桶
--建立桶表
CREATE TABLE mydb.emp_bucket( empno INT, ename STRING, sal DOUBLE, deptno INT ) clustered by (empno) into 4 buckets ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
--強制設定分桶
set hive.enforce.bucketing = true;
--裝載資料
INSERT OVERWRITE TABLE mydb.emp_bucket select empno, ename, sal, deptno from mydb.emp;
----檢視資料檔案
hadoop fs -ls /user/hive/warehouse/mydb.db/emp_bucket
Found 4 items -rwxr-xr-x 1 root supergroup 84 2021-08-03 21:16 /user/hive/warehouse/mydb.db/emp_bucket/000000_0 -rwxr-xr-x 1 root supergroup 40 2021-08-03 21:16 /user/hive/warehouse/mydb.db/emp_bucket/000001_0 -rwxr-xr-x 1 root supergroup 127 2021-08-03 21:16 /user/hive/warehouse/mydb.db/emp_bucket/000002_0 -rwxr-xr-x 1 root supergroup 41 2021-08-03 21:16 /user/hive/warehouse/mydb.db/emp_bucket/000003_0
備註:
資料分桶存在的一些缺陷:
如果通過資料檔案LOAD 到分桶表中,會存在額外的MR負擔。
實際生產中分桶策略使用頻率較低,更常見的還是使用資料分割槽。