大數據備忘錄———將數據從oracle導入impala中

上週遇到了將數據從oracle導入到impala的問題,這個項目耽誤了我近一週的時間,雖然是種種緣由致使的,可是仍是作個總結。linux

需求首先是跑數據,跑數據這個就不敘述,用的是公司的平臺。sql

講講耽誤我最久的事吧 數據的導入導出。數據庫

將數據從oracle導出

PLSQL直接導出

我這邊鏈接公司的orcle數據庫是PLSQL,自己PLSQL就是能夠能夠導出數據的,並且很簡單。服務器

PLSQL在select後就能導出表的數據,能處處成csv、sql、xml等等。oracle

可是這方法最後仍是被捨棄了,有幾個緣由:測試

1.這種導出方法很慢,我導出200M的csv數據須要40分鐘編碼

2.數據導出有限制,這種方法好像最多隻能導出104w數據,可是需求是須要導出1億兩千萬的數據,很明顯是不能夠的。spa

注:中間我考慮過按分區導出數據,由於這個表是按時時間分了分區,而後發現仍是不行,由於數量仍是太大了,30天的數據平均下來每一個仍是有400w,最後放棄了code

事實證實這個方法不是很好用,導出幾百、幾天還行。多了就不行了。xml

使用oracle的內建包UTL_FILE

第二種用orcle裏面用utl_file讀寫文件包 ,每分鐘大約處理百萬行。適用於大量導出時。

1、首先須要新建一個存儲過程

  1 CREATE
  2 OR REPLACE PROCEDURE SQL_TO_CSV (
  3     P_QUERY IN VARCHAR2,-- PLSQL文  
  4     P_DIR IN VARCHAR2,-- 導出的文件放置目錄  
  5     P_FILENAME IN VARCHAR2 -- CSV名  
  6 ) IS L_OUTPUT UTL_FILE.FILE_TYPE;
  7  
  8 L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
  9  
 10 L_COLUMNVALUE VARCHAR2 (4000);
 11  
 12 L_STATUS INTEGER;
 13  
 14 L_COLCNT NUMBER := 0;
 15  
 16 L_SEPARATOR VARCHAR2 (1);
 17  
 18 L_DESCTBL DBMS_SQL.DESC_TAB;
 19  
 20 P_MAX_LINESIZE NUMBER := 32000;
 21  
 22  
 23 BEGIN
 24     --OPEN FILE  
 25     L_OUTPUT := UTL_FILE.FOPEN (
 26         P_DIR,
 27         P_FILENAME,
 28         'W',
 29         P_MAX_LINESIZE
 30     );
 31  
 32 --DEFINE DATE FORMAT  
 33 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
 34  
 35 --OPEN CURSOR  
 36 DBMS_SQL.PARSE (
 37     L_THECURSOR,
 38     P_QUERY,
 39     DBMS_SQL.NATIVE
 40 );
 41  
 42 DBMS_SQL.DESCRIBE_COLUMNS (
 43     L_THECURSOR,
 44     L_COLCNT,
 45     L_DESCTBL
 46 );
 47  
 48 --DUMP TABLE COLUMN NAME  
 49 FOR I IN 1 ..L_COLCNT
 50 LOOP
 51     UTL_FILE.PUT (
 52         L_OUTPUT,
 53         L_SEPARATOR || '"' || L_DESCTBL (I ).COL_NAME || '"'
 54     );
 55  
 56 --輸出表字段  
 57 DBMS_SQL.DEFINE_COLUMN (
 58     L_THECURSOR,
 59     I,
 60     L_COLUMNVALUE,
 61     4000
 62 );
 63  
 64 L_SEPARATOR := ',';
 65  
 66  
 67 END
 68 LOOP
 69 ;
 70  
 71 UTL_FILE.NEW_LINE (L_OUTPUT);--輸出表字段  
 72 --EXECUTE THE QUERY STATEMENT  
 73 L_STATUS := DBMS_SQL. EXECUTE (L_THECURSOR);
 74  
 75 --DUMP TABLE COLUMN VALUE  
 76 WHILE (
 77     DBMS_SQL.FETCH_ROWS (L_THECURSOR) > 0
 78 )
 79 LOOP
 80     L_SEPARATOR := '';
 81  
 82 FOR I IN 1 ..L_COLCNT
 83 LOOP
 84     DBMS_SQL.COLUMN_VALUE (
 85         L_THECURSOR,
 86         I,
 87         L_COLUMNVALUE
 88     );
 89  
 90 UTL_FILE.PUT (
 91     L_OUTPUT,
 92     L_SEPARATOR || '"' || TRIM (
 93         BOTH ' '
 94         FROM
 95             REPLACE (L_COLUMNVALUE, '"', '""')
 96     ) || '"'
 97 );
 98  
 99 L_SEPARATOR := ',';
100  
101  
102 END
103 LOOP
104 ;
105  
106 UTL_FILE.NEW_LINE (L_OUTPUT);
107  
108  
109 END
110 LOOP
111 ;
112  
113 --CLOSE CURSOR  
114 DBMS_SQL.CLOSE_CURSOR (L_THECURSOR);
115  
116 --CLOSE FILE  
117 UTL_FILE.FCLOSE (L_OUTPUT);
118  
119 EXCEPTION
120 WHEN OTHERS THEN
121     RAISE;
122  
123  
124 END;
125  
126 /

 2、建立導出路徑

create or replace directory OUT_PATH as 'D:\out_path';  

注意:這步只是在oracle sql developer中定義了導出路徑,若是路徑不存在,並不會自動生成,須要手動去新建!

3、調用數據

EXEC sql_to_csv('select * from <tablename>','OUT_PATH','<filename>'); 

這種是在網上查到的方法,這邊由於最近公司規定不能下載到本地因此沒有采用這種方法,可是這種方法測試是可行的,沒有具體測試效率。

sqluldr服務器導出數據

第三種是我最後採用的方法

用sqluldr腳本導出到服務上,而後把文件轉移到impala的服務器上去。

下載連接連接:https://pan.baidu.com/s/1bRRr-BDQL0yIJJTa16ttTw
提取碼:1tns

將sqluldr.rar中文件上傳到orcle所在服務器中,而後執行 
./sqluldr2_linux64_10204.binuser= query="" field=',' text=txt file='' charset=UTF8;
file='' 是存放路徑 charset=編碼 user=是orcle數據庫地址 query=是導出語句

而後執行效率100w大概40秒左右,速度比較快。

 數據上傳到impala中

一、將數據從oracle服務器轉移到impala所在服務器

二、在hive中建好導出數據的表

CREATE TABLE tmp.tmp_call_orcle_1 (
test string
)
 ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','  --csv分隔符
STORED AS TEXTFILE;  --設置文件爲test文件

三、用hdfs命令將數據導入到建好的表中:hdfs dfs -put test.csv /user/hive/warehouse/tmp.db/test

四、將表的讀取路徑改爲hdfs路徑

load data inpath '/user/hive/warehouse/tmp.db/tmp_call_orcle_1/tmp_call_orcle_1.csv' into table tmp.tmp_call_orcle_1;

至此就完成了將orcle數據導入impala的操做

相關文章
相關標籤/搜索