sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...
先看下面這條語句,它實現(xiàn)的功能是將特定日期的數(shù)據(jù)從mysql表中直接導(dǎo)入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'這個占位符;
當(dāng)使用雙引號包裹住這個查詢語句時,'$CONDITIONS'前要加上轉(zhuǎn)義符變?yōu)?#39;\$CONDITIONS',而如果使用單引號來包裹,就不用加轉(zhuǎn)義符!
--target-dir
mysql數(shù)據(jù)導(dǎo)入HDFS后的目標(biāo)路徑(也即hive表的“數(shù)據(jù)文件”地址)
--delete-target-dir
導(dǎo)入前是否先刪除target-dir中定義的目錄(如果存在的話)
說明:這個參數(shù)比較重要!一般情況下,同一條導(dǎo)入語句,第一次執(zhí)行時,要不要這個參數(shù)沒有關(guān)系,但如果是多次執(zhí)行同一條導(dǎo)入語句,而又沒有提前手工刪除目標(biāo)目錄時,就出出現(xiàn)“Output directory hdfs://hadoop:9820/somepath/${target_dir} already exists”,因此,這個參數(shù)一定要加上
--direct
使用直接導(dǎo)入模式,可以提高導(dǎo)入速度
--m 2
指定并行執(zhí)行導(dǎo)入數(shù)據(jù)任務(wù)的map進程個數(shù)
--hive-database / --hive-table t_flight_baseinfo
指定導(dǎo)入到hive中的目標(biāo)數(shù)據(jù)庫與數(shù)據(jù)表名稱
--hive-partition-key / --hive-partition-value
指定hive數(shù)據(jù)表的分區(qū)信息
--hive-overwrite
指定hive中的目標(biāo)表可以被多次覆蓋寫入
--hive-import / --create-hive-table
1、create-hive-table:在hive中創(chuàng)建目標(biāo)表(不管它是不是已經(jīng)存在),如果目標(biāo)表已經(jīng)存在,就會給出“AlreadyExistsException(message:Table XXX already exists”出錯信息;
2、hive-import : hive-import在執(zhí)行時,會自動生成一個建表的sql語句,當(dāng)hive中不存在表時,它即自動創(chuàng)建目標(biāo)表與存儲目錄,然后再導(dǎo)入數(shù)據(jù);
mysql往hive帶分區(qū)表中導(dǎo)入實踐
1、在實踐中發(fā)現(xiàn),當(dāng)需要創(chuàng)建帶分區(qū)的表時,如果使用--create-hive-table參數(shù),則每次都會提示表已存在錯誤(這個表確實是存在);不過,這個錯誤提示不影響命令的正確執(zhí)行;
2、但是,如果不帶上這個參數(shù),如果之前這個分區(qū)已存在 ,則會出現(xiàn)在hive表中能查到這個分區(qū),但是它實際的存儲目錄已經(jīng)被刪除(delete-target-dir參數(shù)的效果), hive-import會認(rèn)為此分區(qū)已存在,就停止從mysql中往hdfs中導(dǎo)入數(shù)據(jù),最后提示導(dǎo)入的數(shù)據(jù)numFiles=0,相當(dāng)于分區(qū)表被清空;
3、如果不想每次都看到表已存在的錯誤提示,可以在執(zhí)行導(dǎo)入命令之前,先執(zhí)行一下 hive -e "alter table db_name.tb_name drop partition(partition_key='partition_value');"),先刪除這個分區(qū),這樣hive-import就會創(chuàng)建hive表分區(qū)與重建存儲目錄。當(dāng)然,這時候就不用加--create-hive-table參數(shù)了。
總結(jié)
以上是生活随笔為你收集整理的sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【linux】linux命令如何查看文件
- 下一篇: DELL安装不了mysql_Window