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

来源:https://www.cnblogs.com/luckyfruit/archive/2019/06/24/11076004.html
-Advertisement-
Play Games

上周遇到了將數據從orcle導入到impala的問題,這個項目耽誤了我近一周的時間,雖然是種種原因導致的,但是還是做個總結。 需求首先是跑數據,跑數據這個就不敘述,用的是公司的平臺。 講講耽誤我最久的事吧 數據的導入導出。 將數據從orcle導出 PLSQL直接導出 我這邊連接公司的orcle資料庫 ...


上周遇到了將數據從oracle導入到impala的問題,這個項目耽誤了我近一周的時間,雖然是種種原因導致的,但是還是做個總結。

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

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

將數據從oracle導出

PLSQL直接導出

我這邊連接公司的orcle資料庫是PLSQL,本身PLSQL就是可以可以導出數據的,而且很簡單。

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

但是這方法最後還是被捨棄了,有幾個原因:

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

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

註:中間我考慮過按分區導出數據,因為這個表是按時時間分了分區,然後發現還是不行,因為數量還是太大了,30天的數據平均下來每個還是有400w,最後放棄了

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

使用oracle的內建包UTL_FILE

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

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

  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 /

 二、創建導出路徑

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

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

三、調用數據

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中

1、將數據從oracle伺服器轉移到impala所在伺服器

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

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

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

4、將表的讀取路徑改成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的操作

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Redis 的 Set 是 String 類型的無序集合,元素不允許重覆。 Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。 集合中最大的元素數為 232 - 1 (40多億)。 1、sadd key value1 value2 ...... //向集合中添加一個或 ...
  • Redis列表是簡單的字元串列表,列表是有序的,列表中的元素可以重覆。 可以添加一個元素到列表的頭部(左邊)或者尾部(右邊) 一個列表最多可以包含 232 - 1 個元素 (40多億)。 1、lpush key value1 value2 ..... //往列表的頭部(左邊)推入一個或多個元素,lp ...
  • 解決辦法 處理:1、運行 輸入REgedit ,在註冊表內,查找註冊表項Reports_path。 2、將下載的.pll文件放置到註冊表項Reprots_Path指定的路徑下;如:D:\EBS Home\Pll;D:\EBS Home\Lib; 3、重新打開報表。 ...
  • Redis hash可儲存多個鍵值對,適合儲存對象的屬性。 1、hset key fieldName fileValue //hset即hash set,set這裡是設置的意思。往hash中添加一個欄位(鍵值對) 示例: hset score zhangsan 90 //score是hash的名稱, ...
  • 在生產環境中, 要保證服務在各種極限情況下的穩定和高可用, 所以在部署ES集群時, 需要考慮伺服器的記憶體、CPU、磁碟, 集群的網路、節點個數, 並且要優化JVM的各項參數. 首先從這些方面著手進行部署前的規劃. ...
  • 一.安裝redis #一主二從三台Server安裝步驟相同。 wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar xzf redis-5.0.4.tar.gz cd redis-5.0.4 make 二.配置埠 master默 ...
  • 1、getset key newValue //給key設置value,並返回舊的value,如果沒有舊的value,返回nil。 示例: set age 10 getset age 20 //age 的值被設置為20,並返回舊的值10 2、getrange key start end //獲取va ...
  • ①length 函數說明:計算字元串長度的函數 返回結果:數字 使用圖解: ②lengthb 函數說明:計算字元串位元組長度。在學習過程中,瞭解到還有一個 lengthb 函數。位元組和字元的區別 返回結果:數字 使用圖解:(漢字占兩個位元組,數字和字母占一個位元組) 🌂substr 函數說明:字元截取函 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...