sqoop操作之Oracle導入到HDFS


導入表的所有字段

sqoop import --connect jdbc:oracle:thin:@192.168.1.100:1521:ORCL \
--username SCOTT --password tiger \ --table EMP -m 1;

 查看執行結果:

hadoop fs -cat /user/hadoop/EMP/part-m-00000

7369,SMITH,CLERK,7902,1980-12-17 00:00:00.0,800,null,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00.0,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00.0,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00.0,2975,null,20
……

說明:
1)默認導入到HDFS的路徑是:/user/hadoop(用戶名)/EMP (表名),如果EMP目錄已經存在,則報錯
需要先刪除已經存在的目錄:hadoop fs -rmr /user/hadoop/EMP;
如果相同的命令導入多次,也會報錯的,需要先刪除已經存在的目錄;
2)-m 1表示使用幾個map任務處理,sqoop默認采用4個map任務,有幾個任務在HDFS的執行結果中就有幾個part-m;
3)sqoop默認從數據庫導入到HDFS的分隔符是逗號
4)空列的值使用null
5)sqoop中的map數設置原則:一個表的數據抽取不超過3分鍾,否則就增加map數;

  

導入表的指定字段並指定目標地址

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password  tiger \
--table EMP  \ --columns "EMPNO,ENAME,JOB,SAL,COMM" \ --target-dir EMP_COLUMN  -m 1;

查看執行結果:

hadoop fs -cat /user/hadoop/EMP_COLUMN/part-m-00000

7369,SMITH,CLERK,800,null
7499,ALLEN,SALESMAN,1600,300
7521,WARD,SALESMAN,1250,500
7566,JONES,MANAGER,2975,null
7654,MARTIN,SALESMAN,1250,1400
......

 

說明:
1)通過--target-dir指定導入到HDFS的具體位置
2)通過--columns指定需要導入的列

 

導入表的指定字段並指定目標地址使用指定的分隔符 

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP  \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--target-dir EMP_COLUMN_SPLIT \ --fields-terminated-by '\t' --lines-terminated-by '\n' \ --null-string '' --null-non-string '0'  -m 2;

查看執行結果:

hadoop fs -ls /user/hadoop/EMP_COLUMN_SPLIT

/user/hadoop/EMP_COLUMN_SPLIT/_SUCCESS       
/user/hadoop/EMP_COLUMN_SPLIT/_logs          
/user/hadoop/EMP_COLUMN_SPLIT/part-m-00000   
/user/hadoop/EMP_COLUMN_SPLIT/part-m-00001  

hadoop fs -cat /user/hadoop/EMP_COLUMN_SPLIT/part-m-00001
7654    MARTIN  SALESMAN        1250    1400
7698    BLAKE   MANAGER 2850    0
7782    CLARK   MANAGER 2450    0
7788    SCOTT   ANALYST 3000    0
7839    KING    PRESIDENT       5000    0
7844    TURNER  SALESMAN        1500    0

 

由於這里使用了2個map任務,所以在hdfs的文件中就有了2個part; 由於COMM是NUMBER類型,所以HDFS中就是0。
說明:
1)--null-string '': 當string類型的字段為空時,使用''代替
2)--null-non-string 0 : 當非string類型的字段為空時,使用0代替,項目中不常使用這個配置。
3)--fields-terminated-by '\t':字段之間采用tab分隔
4)--lines-terminated-by '\n':行之間采用回車分隔

  

根據條件導入數據

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP  \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--target-dir EMP_COLUMN_WHERE \
--fields-terminated-by '\t' --lines-terminated-by '\n' \ --where 'SAL>2000' \
--null-string '' --null-non-string '0'  -m 1 ;

查看執行結果:

hadoop fs -cat /user/hadoop/EMP_COLUMN_WHERE/part-m-00000

7566 JONES MANAGER 2975 0
7698 BLAKE MANAGER 2850 0
7782 CLARK MANAGER 2450 0
7788 SCOTT ANALYST 3000 0
7839 KING PRESIDENT 5000 0
7902 FORD ANALYST 3000 0

 

  

保護數據庫密碼方式 

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT  \
--target-dir EMP_COLUMN_PASSWORD1 \
--table EMP -m 1 \
-P;

  Enter password:

 在執行時通過命令行交互的方式輸入密碼;

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT \
--table EMP \
--target-dir EMP_COLUMN_PASSWORD2 \ --password-file /home/hadoop/my-sqoop-password  -m 1 ;

 可以將密碼放置到一個文件中,並且設置這個文件只針對某些人可讀、可寫權限,也能起到密碼安全的作用;

 

更改導入文件格式

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP -m 1 \
--target-dir EMP_SEQUENCEFILE \ --as-sequencefile ;


sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP -m 1 \
--target-dir EMP_AVRODATAFILE \ --as-avrodatafile  ;

 

增量數據導入

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP -m 1 \
--target-dir EMP_APPEND \ --incremental append \ --check-column EMPNO \ --last-value 7788  ;

只導入數據 empno>7788(並不包括7788)的數據,可實現增量導入

查看執行結果:hadoop fs -cat /user/hadoop/EMP_APPEND/part-m-00000

7839,KING,PRESIDENT,null,1981-11-17,5000,null,10
7844,TURNER,SALESMAN,7698,1981-09-08,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23,1100,null,20
7900,JAMES,CLERK,7698,1981-12-03,950,null,30
7902,FORD,ANALYST,7566,1981-12-03,3000,null,20
7934,MILLER,CLERK,7782,1982-01-23,1300,null,10

 

導入沒有主鍵的表到HDFS中

以上的案例導出的表是有主鍵的,下面來演示一個沒有主鍵的表的導出操作。以表SALGRADE為例

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table SALGRADE  \
--target-dir SALGRADE \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '' --null-non-string '0'  -m 2;

 

報錯:
ERROR tool.ImportTool: Error during import: No primary key could be found for table SALGRADE. Please specify one with
--split-by or perform a sequential import with '-m 1'.
原因是沒有找到主鍵,詳見《數據庫導入到HDFS原理》,解決辦法如下:
1)添加主鍵;
2)使用--split-by ' GRADE';
3)使用-m 1,m為幾那么在HDFS上就會生成幾個文件,就不存在按照字段拆分多個任務的問題;

sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table SALGRADE  \
--target-dir SALGRADE \
--fields-terminated-by '\t' --lines-terminated-by '\n' \ --split-by 'GRADE' --null-string '' --null-non-string '0'  -m 2;

查看執行結果:
hadoop fs -ls /user/hadoop/SALGRADE

/user/hadoop/SALGRADE/_SUCCESS        
/user/hadoop/SALGRADE/_logs           
/user/hadoop/SALGRADE/part-m-00000    
/user/hadoop/SALGRADE/part-m-00001    

hadoop fs -cat /user/hadoop/SALGRADE/part-m-00000
1       700     1200
2       1201    1400

 

 

文件腳本導入命令

命令太長,不便查看,將命令寫到文件中去:emp.opt
/home/hadoop/luogankun/workspace/shell/sqoop下創建emp.opt

import  
--connect
jdbc:oracle:thin:@192.168.1.100:1521:ORCL
--username
SCOTT
--password
tiger
--table
EMP
--target-dir
EMP_OPTIONS_FILE
-m
2

 

執行腳本:

cd  /home/hadoop/luogankun/workspace/shell/sqoop
sqoop --options-file ./emp.opt

 


免責聲明!

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



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