目录
- 实战
- 解析和说明
实战
# 打印 datainfo 变量的值
echo $datainfo# 用逗号分隔符解析 datainfo,并将结果存储在一个数组中
var=(${datainfo//,/ })
mark_num=${var[0]}
begin_date=${var[1]}
end_date=${var[2]}# 打印解析出的变量
echo "Mark Number: $mark_num"
echo "Begin Date: $begin_date"
echo "End Date: $end_date"# 检查 mark_num 是否为 "NULL"
if [ "$mark_num" = "NULL" ]; thenexit -1
else# 执行 Spark SQL 查询spark3-sql \--driver-memory "10G" \--executor-memory "20G" \--executor-cores "4" \--conf spark.hadoop.lzo.text.input.format.ignore.nonlzo="false" \--conf spark.locality.wait="0s" \--conf spark.kryoserializer.buffer="512k" \--conf spark.grouping.sets.reference.hive="true" \--conf spark.dynamicAllocation.maxExecutors="200" \--conf spark.executor.memoryOverhead="6G" \--conf spark.dynamicAllocation.enabled="true" \--conf spark.locality.wait.rack="0s" \--hiveconf hive.cli.print.header="false" \--queue "root.mi.sh" \--e "SELECT day,imei,SUM(paly_cnt) AS paly_cnt,SUM(paly_time) AS paly_timeFROM default.testtable2WHERE day BETWEEN '$begin_date' AND '$end_date'GROUP BY day, imei"
fi
解析和说明
1.echo $dateinfo:
打印变量 dateinfo 的值。这个步骤主要用于调试或验证 dateinfo 内容是否正确。
2.var=(${dateinfo//,/ }):
将 dateinfo 中以逗号分隔的字符串转化为数组 var。这个用法利用了 Bash 的参数替换功能,将字符串中的所有逗号替换为空格,然后用圆括号将结果扩展为数组形式。
3.mark_num=${var[0]}:
赋值数组的第一个元素给 mark_num,对应最初 SQL 语句中 count(1) 的结果。
4.begin_date=${var[1]}:
赋值数组的第二个元素给 exper_startdate,对应 SQL 中 min(gray_day) 的结果。
5.end_date=${var[2]}:
赋值数组的第三个元素给 exper_enddate,对应 SQL 中 max(exper_date_end) 的结果。
6.echo $mark_num, echo $begin_date, echo $end_date:
分别打印 mark_num、exper_startdate 和 exper_enddate 的值,通常用于输出查看或进一步验证。
7.if [ “$mark_num” = “NULL” ] ;then:
检查 mark_num 是否为字符串 “NULL”。如果是,说明 SQL 查询可能未返回有效结果或数据,本段代码决定在这种情况下退出脚本。
exit -1:
如果 mark_num 是 “NULL”,执行此命令,脚本以状态码 -1 退出。负数作返回码是非标准用法,通常返回码应在 0-255 之间。
8.Spark SQL 执行
如果 mark_num 不是 “NULL”,则执行 spark3-sql 命令。这条 SQL 查询选择了 day、imei 以及一些聚合的计数与时间总和,条件是 day 在 begin_date 和 end_date 之间,并按 day 和 imei 分组。