#!/bin/bash
source /etc/profile
date1=$1
date2=$2
if [ ! -n "$1" ] ;then
echo "请输入起始日期"
fi
if [ ! -n "$2" ] ;then
echo "请输入结束日期"
fi
#hive配置
#账号名
account=root
#hive的数据库名
hive_database=trade_ods
#hive的表明
hive_table=trade
#昨天的日期,作为分区
yestday=`date -d'-1 day' +%Y-%m-%d`
#分区名
partition=dt
#sqoop抽取到hdfs上的路径
target_dir=/tmp/hive/$account/$hive_database/$hive_table
#mysql配置
ip=192.168.255.0
port=3306
user=root
password=123456
#mysql库名表名
database=trade
table=trade_origin
#代表时间的字段,update_time
date_field=update_time
#需要从mysql里抽取的字段,一般是全部字段
field=id,unit,code,update_time,create_time
#如果没表就建表,[!需要修改!]建表语句里面的字段名和数据类型
hive -e "
create table if not exists $hive_database.$hive_table (
id string,
unit string,
code int,
update_time timestamp,
create_time timestamp
) partitioned by ($parititon string)
ROW FORMAT DELIMITED fields terminated by ',';
"
#通过query将数据抽取到指定目录
output=$( \
sqoop import \
--connect jdbc:mysql://${ip}:${port}/${database}?useSSL=false \
--username ${user} \
--password ${password} \
--query "select ${field} from ${table} where \$CONDITIONS and (CAST($date_field as DATE)<'${date2}' and CAST($date_field as DATE)>='${date1}')" \
--delete-target-dir \
--target-dir $target_dir \
--m 1 \
2>&1)
#加载数据覆盖到昨天的分区
hive -e "
load data inpath '$target_dir/part-m-00000' overwrite into table $hive_database.$hive_table parititon($parititon='$yestday');
"
调度的时候输入两个日期即可,一般是昨天和今天两个日期,也可以指定时间反胃,它会从mysql抽取两个日期内的数据到hdfs上,然后load到hive的分区中,
需要改的有上面的参数还有一个建表语句。