1. 程式人生 > 其它 >Java基礎——TCP通訊程式

Java基礎——TCP通訊程式

分割槽表:

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
from
mydb.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負擔。

實際生產中分桶策略使用頻率較低,更常見的還是使用資料分割槽。