选择这种方式,sqoop把数据直接从mysql导入到hive的指定分区,可以不用去考虑hive表的格式,是否列式存储或者采用了压缩,并且columns参数可以选择自己想要导入hive中的指定mysql列名。
要注意脚本如果重复执行,会往hive分区中重复插入数据,所以在sqoop import 之前先drop掉hive的对应分区。
#!/bin/bash
# 定义变量
sqoop=/usr/local/service/sqoop/bin/sqoop
hive=/usr/local/service/hive/bin/hive
mysql_db=**
mysql_table=**
hive_db=**
hive_table=**
columns="***"
# 获取mysql配置文件中的配置
source /usr/local/config/mysql.config
host=${host_15}
port=${port_15}
username=${username_15}
password=${password_15}
# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
if [ -n "$1" ] ;then
do_date=$1
else
do_date=$(date -d "-1 day" +%F)
fi
# 执行之前先删除对应分区,保证脚本可重复执行,避免数据重复
$hive -e "alter table ${hive_db}.${hive_table} drop partition(dt='${do_date}');"
function ods_schema_device_info_da_sqoop() {
"${sqoop}" import --connect "jdbc:mysql://${host}:${port}/${mysql_db}?zeroDateTimeBehavior=convertToNull&
dontTrackOpenResources=true&defaultFetchSize=1000&useCursorFetch=true" \
--username "${username}" \
--password "${password}" \
--driver com.mysql.jdbc.Driver \
--table "${mysql_table}" \
--hcatalog-database "${hive_db}" \
--hcatalog-table "${hive_table}" \
--hcatalog-partition-keys dt \
--hcatalog-partition-values "${do_date}" \
--columns "${columns}" \
--m 1
}
ods_schema_device_info_da_sqoop