apache sgoop 導入數據到 oracle、導出數據到 oracle 實現

業務場景:是在oracle 數據庫和  hive 數據庫中 ,有多個相同結構的表,要求數據從2個庫定時雙向同步。

(導出時可以只導出部分字段,則此時 hive 庫和 oracle 庫中表結構可以並非完全一致)

1. 寫一個文本文檔,把要導入的表名和庫名先編輯好,格式如 oracle_table_list_append.txt :

wate.BUSI_xxx
wate.xxx_xxx_INFO
wate.xxx_USER_xxx
... 

# wate 是 oracle 數據庫名, BUSI_xxx 是表名。
# 可寫多行,腳本執行時讀取每個一行,循環導入每個表的數據。

編寫sgoop  import 腳本並執行即可把數據從 oracle 數據庫導入到 hive 數據庫中。

current=`date -d "yesterday" +%Y-%m-%d`     #獲取當前時間
#current=`date -d "yesterday 20190110" +%Y-%m-%d`     #獲取指定日期的前一天

begin=${current}" 00:00:00"

sed -i '/^$/d' /opt/xxx/sqoop/conf/oracle_table_list_append.txt
cat /opt/xxx/sqoop/conf/oracle_table_list_append.txt|while read line
do
    OLD_IFS="$IFS"
    IFS="."
    arr=($line)
    db_name=${arr[0]}
    table_name=${arr[1]}
    echo "####begin to sqoop from oracle "${db_name}.${table_name} "......"

    sqoop import \
    --connect jdbc:oracle:thin:@192.168.xx.xx:1521/${db_name} \
    --username 數據庫名 \
    --password 數據庫密碼 \
    --table ${table_name} \
    --where "creationtime >=to_date('${begin}','yyyy-mm-dd hh24:mi:ss') or xxxtime>=to_date('${begin}','yyyy-mm-dd hh24:mi:ss') or dxxtime>=to_date('${begin}','yyyy-mm-dd hh24:mi:ss') " \
    --hive-drop-import-delims \
    --null-string '\\N' \
    --null-non-string '\\N' \
    --fields-terminated-by '\007' \
    --lines-terminated-by '\n' \
    --hive-import \
    --hive-table hive數據庫名.${table_name} \
    -m 10

    rc=$?
    if [ $rc -ne 0 ]
        then
            echo "#### sqoop from oracle "${db_name}.${table_name} " failed......"
           # echo "#### sqoop from oracle "${db_name}.${table_name} " failed......"|mail -s "failed crontab_${current}" [email protected]
        else
            echo "####sqoop from oracle "${db_name}.${table_name} " successed......"
    fi

done
current=`date "+%Y-%m-%d %H:%M:%S"`     #獲取當前時間
end_timeStamp=`date -d "$current" +%s`
du_time=$[end_timeStamp-begin_timeStamp]
echo "sqoop total time used:" $du_time "s" 
--where 此參數是條件過濾,全表導入,可不加此參數。

2.  編寫sgoop  export 腳本並執行,則可把數據從 hive 庫 導出到 oracle 數據庫。 

current_datetime=`date "+%Y-%m-%d %H:%M:%S"`
echo "Start Timing Task:"$current_datetime
current=`date "+%Y-%m-%d %H:%M:%S"`     #獲取當前時間
begin_timeStamp=`date -d "$current" +%s`


table_name="cxx_xxx_day"
day=`date -d -1days "+%Y%m%d"` #昨天(此表以天分區,每次只導一天的數據)

    echo "####開始導出"${day}"的數據 into oracle oracle數據庫名."${table_name} "......"
    sqoop export \
    --connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521/oracle數據庫連接名" \
    --username oracle數據庫名 \
    --password oracle數據庫密碼 \
    --table ${table_name} \
    --export-dir "/user/hive/xxx/hivexxx.db/xxx_xxx_day/day=${day}" \
    --columns xxx_no,datatime,xxx_value,xxx_status,xxx_voage,staxx_str,stxxxs_hex,fy_id \
    --input-fields-terminated-by '\007' \
    --input-lines-terminated-by '\n' \
    --input-null-string '\\N' \
    --input-null-non-string '\\N' \
    --m 4
    rc=$?
    if [ $rc -ne 0 ]
        then
	    echo "Timing Task Error:"
            echo "####sqoop from hive into oracle "${table_name} " failed......"
        else
            echo "####sqoop from hive into oracle "${table_name} " successed......"
    fi
current=`date "+%Y-%m-%d %H:%M:%S"`     #獲取當前時間
end_timeStamp=`date -d "$current" +%s`
du_time=$[end_timeStamp-begin_timeStamp]
echo "sqoop total time used:" $du_time "s"
--export-dir 指定HDFS上的文件路徑
--columns 指定要導出的列,可以只導出部分列

 

3. 官網說明文檔:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

要查更多參數和用法可以直接查詢官方文檔。

import說明文檔地址:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_literal_sqoop_import_literal

export說明文檔地址:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_literal_sqoop_export_literal

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章