最近梳理一項sqoop業務,整理如下(儘可能詳細註釋,表名,IP,賬戶密碼,以及實際代碼都做了處理,當作demo看完全可以的,可運行):
1、mysql -> hive(創建任務->執行任務)
- 創建用戶任務腳本
createUserJob.sh
內容如下:
-
sqoop job --delete sqoop_job_1
sqoop job --create sqoop_job_1 -- import
--connect jdbc:mysql://(mysql服務器ip):3307/ucenter
--table mysql_table --columns "c_id,c_company_name" -m 1
--username test --password test --fields-terminated-by '\0001'
--hive-drop-import-delims --null-string '\\N'
--null-non-string '\\N' --hive-import
--hive-overwrite --hive-table hive_table
-- --default-character-set=utf-8
解釋:
創建導入任務 sqoop_job,連接mysql測試用戶下的ucenter庫mysql_table表的”c_id,c_company_name”字段,開啓一個map進程,分隔符使用hive官方默認模式”/0001”,刪除數據中自帶的/r,/n,/01等符號。字符型非字符型空值(NULL)都設置爲”\N”,數據插入到hive中使用hive默認分隔符,開始導入hive,重寫到表hive_table中,寫入編碼方式爲utf-8。
- 創建用戶任務腳本
importUserData.sh
內容如下:
sqoop job –exec sqoop_job_1
解釋:
與任務對應,直接在linux下執行,執行完畢使用sqoop job -list
查看任務列表。
- 全量導入
創建用戶任務腳本scheduler-full_info.sh
內容如下:
#!/bin/bash
> sql=$(cat << !EOF
> USE bdw;
> DROP TABLE IF EXISTS hive_table;
> CREATE EXTERNAL TABLE hive_table(id string,areacode string)
> row format delimited
> fields terminated by '\t'
> stored as textfile;
>
> insert overwrite hive_table select id,areacode,
> from_unixtime(unix_timestamp(update_time,'EEE MMM dd HH:mm:Ss z
> yyyy'),'yyyy-MM-dd HH:mm:ss') as n_update_time from mysql_table where
> substr(from_unixtime(unix_timestamp(update_time, 'EEE MMM dd HH:mm:Ss
> z yyyy'),'yyyy-MM-dd HH:mm:ss'),1,10)!=
> date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1) or
> update_time is null; !EOF)
> `$HIVE_HOME/bin/hive -e "$sql"`
>
> exitCode=$?
> if [ $exitCode -ne 0 ];then
echo "[ERROR] hive execute failed!"
> exit $exitCode
> fi
解釋:
EOF,即:END OF FILE(文件結束)
命令<< EOF 內容段 EOF
,即:將“內容段”整個作爲命令的輸入不一定要用EOF也可以用比如!EOF或者其他內容段中沒有出現過的字符。
命令解釋:用cat命令讀入整段字符串並賦值給sql變量。
DROP TABLE IF EXISTS hive_table;
, 如果hive表已經存在就刪除。
CREATE EXTERNAL TABLE hive_table
創建託管表 hive_table(各字段值),行分隔符爲”\t”,存儲爲文本格式。
$HIVE_HOME/bin/hive -e "$sql"
,hive執行sql。
- 增量導入
創建用戶任務腳本scheduler-increment_info.sh
內容如下
> #!/bin/bash
> sql=$(cat << !EOF
> insert into table hive_table select id,areacode,
> from_unixtime(unix_timestamp(update_time,'EEE MMM
> dd HH:mm:Ss z yyyy'),'yyyy-MM-dd HH:mm:ss')
> as n_update_time from
> company_business_info where
> substr(from_unixtime(unix_timestamp(update_time,'EEE MMM dd HH:mm:Ss z
> yyyy'),'yyyy-MM-dd HH:mm:ss'),1,10)
> =date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1);
> !EOF)
>
> $HIVE_HOME/bin/hive -e $sql
> exitCode=$?
> if [ $exitCode -ne 0 ];then
> echo "[ERROR] hive execute failed!"
> exit $exitCode
> fi
解釋:
substr
(from_unixtime
(unix_timestamp
(update_time,’EEE MMM dd HH:mm:Ss z yyyy’),’yyyy-MM-dd HH:mm:ss’),1,10)
即:
unix_timestamp(),返回自1970-1-1 8:00:00開始到當前系統時間爲止的秒數;
from_unixtime(unixtime),返回unix時間到系統時間(“1970-1-1 8:00:00”這種形式);
substr(),substr(string string,num start,num length);string爲字符串;start爲起始位置(mysql中從1開始),length爲字符串長度;
exitCode=\$?
“$?”,即:最後一次執行命令的退出狀態返回碼,0表示全部執行,1~255表示有錯誤。
if [ $exitCode -ne 0 ];then
echo "[ERROR] hive execute failed!"
exit $exitCode
fi
即:if/then結構測試,不僅可以測試狀態,還可以測試任何命令。”-ne”表示不等於。
2、mysql->hive(創建本地表 -> 執行導出任務)
- 創建本地表
DROP TABLE IF EXISTS mysql_table;
CREATE TABLE mysql_table (
date
varchar(255) DEFAULT NULL COMMENT ‘時間’,
region_code
varchar(255) DEFAULT NULL COMMENT ‘區域’,
KEYdate
(date
) USING BTREE,
KEYregion
(region_code
) USING BTREE,
KEYversion
(version
) USING BTREE,
KEYsite
(site
) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
舉個建數據庫表的demo。
- 執行導出任務
sqoop export –connect jdbc:mysql://(數據庫服務器ip):3306/data_analyses
–username test –password test –table d_service_unit
–export-dir /user/hive/warehouse/edw.db/d_service_unit
–input-fields-terminated-by ‘\001’ –input-null-string ‘\N’ –input-null-non-string ‘\N’
解釋:
export -dir /user/hive/warehouse/edw.db/d_service_unit 爲導出路徑。其他參數參考導出到hive表。
至此階段性結束,學無止境。