先看下面這條語句,它實現(xiàn)的功能是將特定日期的數(shù)據(jù)從mysql表中直接導入hive
$ sqoop import \
--connect jdbc:mysql://192.168.xx.xx:3306/db_name?useSSL=false \
--username xxx --password xxxxxx \
--query "select d.id, d.callsign, d.sobt from t_flight_baseinfo d where d.id is not null and d.sobt >= '2020-12-27' and \$CONDITIONS" \
--target-dir /user/hive/warehouse/datapros.db/t_flight_baseinfo/dt=2020-12-27 \
--delete-target-dir --fields-terminated-by '\t' --split-by d.id \
--hive-import --hive-overwrite --m 2 --direct \
--hive-database datapros --hive-table t_flight_baseinfo \
--hive-partition-key dt --hive-partition-value 2020-12-27
以下對命令中的參數(shù)作簡單說明:
--connect /--username / --password
很明顯洒忧,這是mysql數(shù)據(jù)庫的連接字符串
--query
這是選取數(shù)據(jù)的查詢語句匆赃。這里需要注意的是:
- 每條查詢語句必須要添加where條件猿推;
- 末尾還要加上'$CONDITIONS'這個占位符;
- 當使用雙引號包裹住這個查詢語句時介衔,'$CONDITIONS'前要加上轉義符變?yōu)?\$CONDITIONS'址貌,而如果使用單引號來包裹删壮,就不用加轉義符贪绘!
--target-dir
mysql數(shù)據(jù)導入HDFS后的目標路徑(也即hive表的“數(shù)據(jù)文件”地址)
--delete-target-dir
導入前是否先刪除target-dir中定義的目錄(如果存在的話)
說明:這個參數(shù)比較重要!一般情況下央碟,同一條導入語句税灌,第一次執(zhí)行時,要不要這個參數(shù)沒有關系亿虽,但如果是多次執(zhí)行同一條導入語句菱涤,而又沒有提前手工刪除目標目錄時,就出出現(xiàn)“Output directory hdfs://hadoop:9820/somepath/${target_dir} already exists”洛勉,因此粘秆,這個參數(shù)一定要加上
--direct
使用直接導入模式,可以提高導入速度
--m 2
指定并行執(zhí)行導入數(shù)據(jù)任務的map進程個數(shù)
--hive-database / --hive-table t_flight_baseinfo
指定導入到hive中的目標數(shù)據(jù)庫與數(shù)據(jù)表名稱
--hive-partition-key / --hive-partition-value
指定hive數(shù)據(jù)表的分區(qū)信息
--hive-overwrite
指定hive中的目標表可以被多次覆蓋寫入
--hive-import / --create-hive-table
1收毫、create-hive-table:在hive中創(chuàng)建目標表(不管它是不是已經(jīng)存在)攻走,如果目標表已經(jīng)存在,就會給出“AlreadyExistsException(message:Table XXX already exists”出錯信息此再;
2昔搂、hive-import : hive-import在執(zhí)行時,會自動生成一個建表的sql語句输拇,當hive中不存在表時摘符,它即自動創(chuàng)建目標表與存儲目錄,然后再導入數(shù)據(jù)策吠;
mysql往hive帶分區(qū)表中導入實踐
1议慰、在實踐中發(fā)現(xiàn),當需要創(chuàng)建帶分區(qū)的表時奴曙,如果使用--create-hive-table參數(shù),則每次都會提示表已存在錯誤(這個表確實是存在)草讶;不過洽糟,這個錯誤提示不影響命令的正確執(zhí)行;
2、但是坤溃,如果不帶上這個參數(shù)拍霜,如果之前這個分區(qū)已存在 ,則會出現(xiàn)在hive表中能查到這個分區(qū)薪介,但是它實際的存儲目錄已經(jīng)被刪除(delete-target-dir參數(shù)的效果)祠饺, hive-import會認為此分區(qū)已存在,就停止從mysql中往hdfs中導入數(shù)據(jù)汁政,最后提示導入的數(shù)據(jù)numFiles=0道偷,相當于分區(qū)表被清空;
3记劈、如果不想每次都看到表已存在的錯誤提示勺鸦,可以在執(zhí)行導入命令之前,先執(zhí)行一下 hive -e "alter table db_name.tb_name drop partition(partition_key='partition_value');"),先刪除這個分區(qū)目木,這樣hive-import就會創(chuàng)建hive表分區(qū)與重建存儲目錄换途。當然,這時候就不用加--create-hive-table參數(shù)了刽射。