解决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

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注