解决Sqoop从mysql导出数据到hive结果为空时的报错
在海豚调度器1.3.5,用Sqoop从hive导入数据到mysql,有时由于计算结果为空,导致hive的表当天分区的数据为空,Sqoop导出到mysql时报错。海豚调度器设置了失败继续策略也没用,导致后面的工作流没办法继续执行下去。
可以在执行sqoop之前增加判断当天分区的数量是否为空,如果为空就不执行导出。
# 检查分区是否为空
empty=$(hive -S -e "SELECT COUNT(*) FROM cnsaas.ads_bigdata_iot_data WHERE dt='$yesday_date';" | awk '{print $1}')
if [ "$empty" -eq 0 ]; then
echo "分区为空,不执行 Sqoop 导出。"
else
echo "分区非空,执行 Sqoop 导出。"
完整的sqoop脚本如下:
#!/bin/bash
# 定义变量
host="your_host"
user="your_user"
pwd="your_password"
yesday_date=$(date -d "yesterday" +%Y-%m-%d)
# 检查分区是否为空
empty=$(hive -S -e "SELECT COUNT(*) FROM cnsaas.ads_bigdata_iot_data WHERE dt='$yesday_date';" | awk '{print $1}')
if [ "$empty" -eq 0 ]; then
echo "分区为空,不执行 Sqoop 导出。"
else
echo "分区非空,执行 Sqoop 导出。"
sqoop export \
--connect jdbc:mysql://$host:3306/zgcn?characterEncoding=UTF-8 \
--username $user \
--password $pwd \
-m 1 \
--table ads_bigdata_iot_data\
--columns stat_date,data_type,stat_type,cu_pid_system_code,max_value,min_value,avg_value \
--fields-terminated-by '\001' \
--update-key stat_date,data_type,stat_type,cu_pid_system_code \
--update-mode allowinsert \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--null-string '\\N' --null-non-string '\\N' \
--export-dir /user/hive/warehouse/cnsaas.db/ads_bigdata_iot_data/dt=$yesday_date/*
fi