一、Hive中load語句的語法說明 Hive Load語句不會在載入數據的時候做任何轉換工作,而是純粹的把數據文件複製/移動到Hive表對應的地址。語法格式如下: LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablenam ...
一、Hive中load語句的語法說明
Hive Load語句不會在載入數據的時候做任何轉換工作,而是純粹的把數據文件複製/移動到Hive表對應的地址。語法格式如下:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename \ [PARTITION (partcol1=val1, partcol2=val2 ...)] LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename \ [PARTITION (partcol1=val1, partcol2=val2 ...)] \ [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)
幾點說明:
- 如果命令中帶有LOCAL,說明從本地文件系統載入數據,文件路徑可以是相對路徑,也可以是絕對路徑。在這種情況下,首先將文件從本地複製到hdfs相應的位置,然後移動到hive表格中,這個時候原始數據文件是存在於Hive表之下的路徑下。
- 如果不包含LOCAL關鍵字,則移動HDFS文件到目標表中。
- filepath 可以是一個相對路徑,也可以是一個絕對路徑。可以是一個文件,也可以是一個文件夾目錄。如果是一個目錄,這個時候文件夾下的所有文件都會被載入。
- 命令中如果帶有overwirte,代表載入數據之前會清空目標表格,否則就是追加的方式。
- 如果表是分區表則必須指定PARTITION從句,否則會報如下錯誤:
FAILED:SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned
二、load語句示例
- 創建如下的表結構(員工表)
create table emp (empno int, ename string, job string, mgr int, hiredate string, sal int, comm int, deptno int) row format delimited fields terminated by ',';
- 測試數據如下:(emp.csv)
7369,SMITH,CLERK,7902,1980/12/17,800,0,20 7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30 7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30 7566,JONES,MANAGER,7839,1981/4/2,2975,0,20 7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30 7698,BLAKE,MANAGER,7839,1981/5/1,2850,0,30 7782,CLARK,MANAGER,7839,1981/6/9,2450,0,10 7788,SCOTT,ANALYST,7566,1987/4/19,3000,0,20 7839,KING,PRESIDENT,-1,1981/11/17,5000,0,10 7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30 7876,ADAMS,CLERK,7788,1987/5/23,1100,0,20 7900,JAMES,CLERK,7698,1981/12/3,950,0,30 7902,FORD,ANALYST,7566,1981/12/3,3000,0,20 7934,MILLER,CLERK,7782,1982/1/23,1300,0,10
- 載入HDFS的數據到Hive的表
load data inpath '/scott/emp.csv' into table emp;
- 載入本地的數據到Hive的表
load data local inpath '/root/temp/emp.csv' into table emp;
當然我們也可以使用insert語句載入數據。例如,我們創建如下的分區表:
create table emp_part_1 (empno int, ename string, job string, mgr int, hiredate string, sal int, comm int) partitioned by (deptno int) row format delimited fields terminated by ',';
使用insert語句將數據插入到對應的分區上。
插入10號部門的員工數據 insert into table emp_part_1 partition(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=10; 插入20號部門的員工數據 insert into table emp_part_1 partition(deptno=20) select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=20; 插入30號部門的員工數據 insert into table emp_part_1 partition(deptno=30) select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=30;
這裡我們使用了一個子查詢查詢出了對應部門的員工數據,再使用insert語句插入到對應的分區上。