1. 程式人生 > >利用SQOOP將ORACLE到HDFS

利用SQOOP將ORACLE到HDFS

#Oracle的連線字串,其中包含了URL,SID,和PORT
URL=jdbc:oracle:thin:@132.232.19.79:10521:szdw

#使用的使用者名稱
USERNAME=szdw
#使用的密碼
PASSWORD=szdw
#需要從Oracle中匯入的表名
TableNAME=proc_resource_admin
#需要從Oracle中匯入的表中的欄位名
COLUMNS=AREA_ID,TEAM_NAME
#將Oracle中的資料匯入到HDFS後的存放路徑
HADFPATH=/home/hadoop/data/proc_resource_admin

#執行匯入邏輯。將Oracle中的資料匯入到HDFS中
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HAFSPATH  --num-mappers 1 --table $TABLENAME --COLUMNS $columns --fields-terminated-by '\t';

執行這個指令碼之後,匯入程式就完成了。

接下來,使用者可以自己建立外部表,將外部表的路徑和HDFS中存放Oracle資料的路徑對應上即可。

注意:這個程式匯入到HDFS中的資料是文字格式,所以在建立Hive外部表的時候,不需要指定檔案的格式為RCFile,而使用預設的TextFile即可。資料間的分隔符為'\t'。如果多次匯入同一個表中的資料,資料以append的形式插入到HDFS目錄中。

並行匯入

假設有這樣這個sqoop命令,需要將Oracle中的資料匯入到HDFS中:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 1 --table $TABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26'";

請注意,在這個命令中,有一個引數“-m”,代表的含義是使用多少個並行,這個引數的值是1,說明沒有開啟並行功能。

現在,我們可以將“-m”引數的值調大,使用並行匯入的功能,如下面這個命令:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 4 --table $TABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26'";

一般來說,Sqoop就會開啟4個程序,同時進行資料的匯入操作。

但是,如果從Oracle中匯入的表沒有主鍵,那麼會出現如下的錯誤提示:

ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'.

在這種情況下,為了更好的使用Sqoop的並行匯入功能,我們就需要從原理上理解Sqoop並行匯入的實現機制。

如果需要並行匯入的Oracle表的主鍵是id,並行的數量是4,那麼Sqoop首先會執行如下一個查詢:

select max(id) as max, select min(id) as min from table [where 如果指定了where子句];

通過這個查詢,獲取到需要拆分欄位(id)的最大值和最小值,假設分別是1和1000。

然後,Sqoop會根據需要並行匯入的數量,進行拆分查詢,比如上面的這個例子,並行匯入將拆分為如下4條SQL同時執行:

select * from table where 0 <= id < 250;

select * from table where 250 <= id < 500;

select * from table where 500 <= id < 750;

select * from table where 750 <= id < 1000;

注意,這個拆分的欄位需要是整數。

從上面的例子可以看出,如果需要匯入的表沒有主鍵,我們應該如何手動選取一個合適的拆分欄位,以及選擇合適的並行數。

再舉一個實際的例子來說明:

我們要從Oracle中匯入creater_user.popt_cas_redirect_his。

這個表沒有主鍵,所以我們需要手動選取一個合適的拆分欄位。

首先看看這個表都有哪些欄位:

然後,我假設ds_name欄位是一個可以選取的拆分欄位,然後執行下面的sql去驗證我的想法:

select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'

發現結果不理想,min和max的值都是相等的。所以這個欄位不合適作為拆分欄位。

再測試一下另一個欄位:CLIENTIP
select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'

這個結果還是不錯的。所以我們使用CLIENTIP欄位作為拆分欄位。

所以,我們使用如下命令並行匯入:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 12 --split-by CLIENTIP --table $TABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26'";

這次執行這個命令,可以看到,消耗的時間為:20mins, 35sec,匯入了33,222,896條資料。

另外,如果覺得這種拆分不能很好滿足我們的需求,可以同時執行多個Sqoop命令,然後在where的引數後面指定拆分的規則。如:

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 1 --table $oTABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26' logtime<10:00:00"

sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH  --m 1 --table $oTABLENAME --columns $columns --fields-terminated-by '\t'  --where "data_desc='2011-02-26' logtime>=10:00:00"

從而達到並行匯入的目的。

相關推薦

利用SqoopMySQL數據導入Hive中

sqoop參考http://www.cnblogs.com/iPeng0564/p/3215055.htmlhttp://www.tuicool.com/articles/j2yayyjhttp://blog.csdn.net/jxlhc09/article/details/168568731.list da

利用sqoophive資料匯入Oracle中(踩的坑)

教程很多,這裡只說踩過的坑 1.下載sqoop時,還得下一個bin的包,拿到sqoop-1.4.6.jar 的包,放到hadoop的lib目錄下 2.匯入oracle,執行程式碼時,使用者名稱和表名必須大寫!且資料庫建表時表名必須大寫!  示例程式碼: sqoop expo

利用sqoophive資料匯入Oracle中

首先: 如oracle則執行sqoop list-databases --connect jdbc:oracle:thin:@//192.168.27.235:1521/ORCL --username DATACENTER -P 來測試是否能正確連線資料庫  如mysql則執行sq

利用sqoophive資料匯入匯出資料到mysql

執行環境  centos 5.6   hadoop  hive sqoop是讓hadoop技術支援的clouder公司開發的一個在關係資料庫和hdfs,hive之間資料匯入匯出的一個工具 在使用過程中可能遇到的問題: sqoop依賴zookeeper,所以必須配置ZOOK

利用SQOOPORACLE到HDFS

#Oracle的連線字串,其中包含了URL,SID,和PORT URL=jdbc:oracle:thin:@132.232.19.79:10521:szdw #使用的使用者名稱 USERNAME=szdw #使用的密碼 PASSWORD=szdw #需要從Oracle中匯入

利用SqoopMySQL海量測試資料匯入HDFS和HBase

宣告:作者原創,轉載註明出處。 一、安裝Sqoop 1、下載sqoop,解壓、資料夾重新命名 wget http://mirror.bit.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin_

利用sqoophive和MySQL資料互匯入

1.    hadoop、hive、MySQL安裝(略)啟動hadoop 執行start-all.sh start-dfs.sh start-yarn.sh 2.    下載sqoop 3.    解壓 #tar -zxvfsqoop-1.4.6.bin__hadoop-

利用sqoop指定列指定條件的方式資料從mysql中增量匯入hive表中

========1、sqoop增量(指定列指定條件的方式增量匯入hive表中)匯入hive指令碼======= #!/bin/bash #Set the RDBMS connection params rdbms_ip=$1 rdbms_connect="jdbc:mysq

Sqoop_具體總結 使用SqoopHDFS/Hive/HBase與MySQL/Oracle中的數據相互導入、導出

能夠 mes south ase form html 技術 popu 沒有 一、使用Sqoop將MySQL中的數據導入到HDFS/Hive/HBase 二、使用Sqoop將HDFS/Hive/HBase中的數據導出到MySQL 2.3 HBase中的數據

利用GsonJSON數據進行格式化(pretty print)

div pretty string類型 overflow jsonp creat () one ons 我們可以利用Gson包將String類型的JSON數據進行格式化。 Gson gson = new GsonBuilder().setPrettyPrinting().

Struts2.5 利用Ajaxjson數據傳值到JSP

const enable sta func 創建 方法調用 方法 後臺 encoding AJAX +JSON=》JSP AJAX   AJAX 是一種在無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。 通過在後臺與服務器進行少量數據交換,AJAX 可以使網頁

利用Git項目傳到GitHub上

test bsp repos 出現 github項目 rip 信息 標識 全部 利用Git打開項目所在的目錄 第一步:git init 把目錄變成Git可以管理的倉庫 第二步: git add . 把項目中的文件全部添加到倉庫(暫存區)     git add &l

利用sqoop從 hive中往mysql中導入表出現的問題

ive ptr 解析 修改 技術 字段 map temp article 這個錯誤的原因是指定Hive中表字段之間使用的分隔符錯誤,供Sqoop讀取解析不正確。如果是由hive執行mapreduce操作匯總的結果,默認的分隔符是 ‘\001‘,否則如果是從HDFS文件導入

如何利用fastjsonJSON格式的字符串轉換為Map,再返回至前端成為js對象

數據結構 mem spring css 轉換 ring 註意 hash 結構 //註意,這裏的jsonStr是json格式的字符串,裏面如果遇到雙引號嵌套雙引號的,一般是嵌套的雙引號經過轉義 // \",假如有這樣的一個場景,這些字符串裏面有需要的css樣式的js對象

利用tortoisegit本地項目推送至gitlab指定group

這一 sig 指定 因此 group tlab 重復 管理 gin 直接上步驟: 1、在gitlab上新建group,如下圖,右上角有個 "+",點擊可以選擇新建project、group、snippet。然後取名,此名字在gitlab上具有唯一性,因此可能會提示重復,比如

利用Python多個excel文件合並為一個文件

技術分享 excel文件 AR tails bsp 合並 sdn clas pytho http://blog.csdn.net/betterfate/article/details/71123976 http://blog.csdn.net/d1240673769/

如何利用kmeans數據更加準確地聚類---利用隱含變量最佳類別(EM算法思想)實現

空間 算法 mage ref 變化 val and 情況 ble K-means也是聚類算法中最簡單的一種了,但是裏面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較註重應用。看了Andrew Ng的這個講義後才有些明白K-mean

java利用反射pojo轉為json對象

需要 ktr OS reflect res pojo json.js code substring 最近做以太坊錢包項目需要與前臺進行json交互,寫一個工具類,經普通javaBean轉為json對象 1 package util; 2 3 import java

【開發者筆記】利用shp2pgsqlshape文件導入到postgresql中

info isp TP 命令 文件拷貝 最好 導入失敗 註意事項 eat 導入shp文件到postgresql中 1、首先,你需要讓shp2pgsql命令可用,百度下載,加入環境變量即可。   下載地址:https://download.osgeo.org/pos

利用pandasmysql查詢出得結果寫入到excel文件

pandas excel#!/usr/bin/env python3import pandas as pdimport pymysql#返回SQL結果的函數def getrel(sql): conn = pymysql.connect(host='localhost',user=