일, 주, 월, 분기 별 데이터웨어 하우스 ETL (shell + sql) 요약 통계 코드 개발 템플릿

목차

0 머리말

1 셸에서의 날짜 사용 요약

1.1 기본 문법

1.2 날짜는 현재 시간을 보여줍니다

1.3 날짜는 현재 시간이 아닌 시간을 표시합니다.

2 일별 통계

3 주별 통계

4 월간 통계

5 분기 별 통계

6 요약



0 머리말

데이터웨어 하우스 ETL 통계의 경우 일, 주, 월 및 분기와 같은 여러 시간 차원에서 데이터에 대한 일괄 통계를 수행해야하는 경우가 많습니다. 일반 개발 모드는 셸에서 sql 형식이므로 시간이 지정된 작업에 따라 셸 스크립트를 실행할 수 있으며 동시에 셸을 사용하여 SQL의 저장 프로 시저를 대체하는 일부 함수를 작성할 수 있습니다. 이 기사에서 일, 주, 월 및 분기의 시간 차원도 쉘의 시간 함수를 사용하여 계산되므로 SQL 개발의 어려움을 줄이고 코드를보다 쉽게 ​​유지 보수 할 수 있습니다.

shell中时间的获取常常采用date -d 或date --date来获取

1 셸에서의 날짜 사용 요약

1.1 기본 문법

1) 기본 문법

날짜 [옵션] ... [+ 포맷]

2) 옵션 설명

표 1-20

옵션

풍모

-d <시간 문자열>

현재 시간 대신 지정된 "시간 문자열"로 표시된 시간을 표시합니다.

-s <날짜 시간>

시스템 날짜 및 시간 설정

3) 매개 변수 설명

표 1-21

매개 변수

풍모

<+ 날짜 시간 형식>

표시 할 때 사용되는 날짜 및 시간 형식 지정

1.2 날짜는 현재 시간을 보여줍니다

1) 기본 문법

(1) 날짜 (기능 설명 : 현재 시간 표시)

(2) 날짜 + % Y (기능 설명 : 현재 연도 표시)

(3) 날짜 + % m (기능 설명 : 현재 월 표시)

(4) 날짜 + % d (기능 설명 : 현재 날짜 표시)

(5) 날짜 "+ % Y- % m- % d % H : % M : % S"(기능 설명 : 년, 월, 일,시, 분, 초 표시)

2) 사례 연습

(1) 현재 시간 정보 표시

[root@bigdata-1 ~]# date

2020年 10月 26日 星期一 13:40:45 CST

(2) 현재 시간의 년, 월, 일 표시

[root@bigdata-1 ~]# date +%Y%m%d

20201026

(3) 현재 시간 년, 월, 일,시, 분, 초 표시

[root@bigdata-1 ~]# date "+%Y-%m-%d %H:%M:%S"

2020-10-26 13:42:15

1.3 날짜는 현재 시간이 아닌 시간을 표시합니다.

1) 기본 문법

(1) date -d '1 days ago'(기능 설명 : 전날 시간 표시)

(2) 날짜 -d'-1 일 전 '(기능 설명 : 내일 시간 표시)

2) 사례 연습

(1)显示前一天

[root@bigdata-1 ~]# date -d '1 days ago'

2020年 10月 25日 星期日 13:42:45 CST
[root@bigdata-1 ~]# date -d '-1 days'

2020年 10月 25日 星期日 13:43:25 CST

[root@bigdata-1 ~]# date -d 'last day'

2020年 10月 25日 星期日 13:43:51 CST


(2)显示明天时间

[root@bigdata-1 ~]# date -d '1 days'

2020年 10月 27日 星期二 13:44:53 CST

[root@bigdata-1 ~]# date -d '-1 days ago'

2020年 10月 27日 星期二 13:44:28 CST

[root@bigdata-1 ~]# date -d 'next day'

2020年 10月 27日 星期二 13:47:37 CST

(3)指定时间显示

[root@bigdata-1 ~]# date -d '2020-10-26 3 months ago'

2020年 07月 26日 星期日 00:00:00 CST

1.4 날짜 시스템 시간 설정

1) 기본 문법

       날짜 -s 문자열 시간

2) 사례 연습

       (1) 시스템의 현재 시간 설정

[root@bigdata-1 ~]# date -s "2020-10-26 13:52:18" 

2 일별 통계

#!/bin/bash

#1获取时间
lastday=`date --date '-1days' +%F` #获得昨天的日期(今天算昨天的)
if [ "$1" != "" ];then
    lastday=$1
fi;
#2定义变量
hive='/usr/idp/current/hive-client/bin/hive';
APP=phmdwdb
input_table="${APP}.输入表名";
output_table="${APP}.输出表名";

#3写SQL
sql="
insert overwrite table ${output_table}
PARTITION (compute_day='${lastday}')
select
     ,xxx
     ,xxx
     ,xxx
from ${input_table}
where compute_day='${lastday}' 
...........
...........  
;
";

#执行SQL

${hive} -e "${sql}" >>/tmp/${output_table}.log  2>&1 ;

3 주별 통계

#!/bin/bash

#按周统计的表依赖于按天统计的表,因此输入的表为按天统计的表
#1获取时间,每周周一开始算上周的任务
today=`date +%F` #获得当前的日期
start_week=`date -d "${today} -7 days" +%F` #获取上周的周一日期
end_week=`date -d "${today} -1 days" +%F` #获取上周的周末日期
day=`date -d "${today}" +%w` #获取if条件中要匹配的日期
compute_week=`date -d "${start_week}" +%V` #%V:以周一为每周的第一天。%U:以以周日为每星期第一天
if [ "$1" != "" ];then
    today=$1
fi;

#2定义变量
hive='/usr/idp/current/hive-client/bin/hive';
APP=phmdwdb
input_table="${APP}.输入表名";
output_table="${APP}.输出表名";

#3写SQL
sql="
insert overwrite table ${output_table}
PARTITION (compute_week='${compute_week}')
select
     ,xxx
     ,xxx
     ,xxx
from ${input_table}
where compute_day>='${start_week}' and compute_day<'${today}' --注意按周分析的依赖于按天统计的表,所以用compute_day
...........
...........  
;
";

#执行SQL

if [ ${day} == '1' ];then

   ${hive} -e "${sql}"   >>/tmp/$log_dir.log  2>&1 ;
else
   echo '只有在周一计算上一周的统计值';
fi

4 월간 통계

#!/bin/bash

#按月统计的表依赖于按天统计的表,因此输入的表为按天统计的表
#1获取时间,每月初开始算上月的任务
today=`date +%Y-%m-%d` #获得当前的日期
start_date=`date -d "${today} -1 days " +%Y-%m-01` #获得上个月月初的时间
end_date=`date -d"${today} last day" +%Y-%m-%d` #上个月最后一天
day=`date -d "${today}"+%d`; #获取当前需要匹配的时间.(只有月初的时候才会计算,月初时获取天值为01)
compute_month=`date -d ${start_date} +%Y-%m`; #获取静态分区的指定健值。计算的是上个月。

if [ "$1" != "" ];then
    today=$1
fi;

#2定义变量
hive='/usr/idp/current/hive-client/bin/hive';
APP=phmdwdb
input_table="${APP}.输入表名";
output_table="${APP}.输出表名";

#3写SQL
sql="
insert overwrite table ${output_table}
PARTITION (compute_month='${compute_month}')
select
     ,xxx
     ,xxx
     ,xxx
from ${input_table}
where compute_day>='${start_date}' and compute_day<'${today}' --注意按月分析的依赖于按天统计的表,所以用compute_day
...........
...........  
;
";

#执行SQL.月的时候匹配的是01

if [ ${day} == '01' ];then

   ${hive} -e "${sql}"   >>/tmp/$log_dir.log  2>&1 ;
else
   echo '只有在月初计算上一月的统计值';
fi

5 분기 별 통계

 참고 :이 스크립트는 계산할 때 쉘의 나누기 연산을 사용하며 쉘의 나누기는 bc 계산기로 수행됩니다. 여기서 scale은 소수점 이하 자릿수이고 양쪽에 공백이 있습니다. 셸이 덧셈, 뺄셈, 곱셈, 나눗셈을 계산할 때 정수 연산 인 경우 일반적으로 $ ((a + b)) 또는 $ [a + b]를 사용합니다. 10 진수 연산 인 경우 bc 계산기는 다음과 같습니다. 일반적으로 계산에 사용되며 스케일 컨트롤러에는 소수점 이하 자릿수가 있습니다.

#!/bin/bash

#按季度统计的表依赖于按月统计的表,因此输入的表为按月统计的表
#1获取时间,每季度初开始算上季度的任务
today=`date +%F` #获取当前的日期	 
current_month=`date -d "${today}" +%Y-%m` #获取当前的月份
start_month=`date -d "${today} 3 month ago" +%Y-%m` #获取季度开始的月份
end_month=`date -d "${today} -1 month" +%Y-%m` #获取季度结束的月份
match=`date -d "${today}" +%m` #获取条件需要匹配的值
temp=`date -d ${start_quarter}_01 +%m` #获取上一季度开始的月份数字,作为中间结果值
compute_quarter=`echo "scale=0; (${temp}-1) / 3 + 1" | bc` # 计算静态分区的健值,季度值。按月份求季度的算法。

if [ "$1" != "" ];then
    today=$1
fi;

#2定义变量
hive='/usr/idp/current/hive-client/bin/hive';
APP=phmdwdb
input_table="${APP}.输入表名";
output_table="${APP}.输出表名";

#3写SQL
sql="
insert overwrite table ${output_table}
PARTITION (compute_quarter='${compute_quarter}')
select
     ,xxx
     ,xxx
     ,xxx
from ${input_table}
where compute_month>='${start_month}' and compute_month<'${current_month}' --注意按季度分析的依赖于按月统计的表,所以用compute_month
...........
...........  
;
";

#执行SQL.季度的时候匹配的是01,04,07,10.每过一季度统计一次

if [ ${match} == '01' ]; then 
${hive} -e "set mapred.job.name=统计第四季度;${sql}"  >>/tmp/$log_dir.log  2>&1;
elif [ ${match} == '04' ]; then
${hive} -e "set mapred.job.name=统计第一季度;${sql}"  >>/tmp/$log_dir.log  2>&1;
elif [ ${match} == '07' ]; then
${hive} -e "set mapred.job.name=统计第二季度;${sql}"  >>/tmp/$log_dir.log  2>&1;
elif [ ${match} == '10' ]; then
${hive} -e "set mapred.job.name=统计第三季度;${sql}"  >>/tmp/$log_dir.log  2>&1;
else
echo '只有等到季度初的时候才进行统计';
fi 

6 요약

이 기사의 여러 코드 개발 템플릿은 실제 ETL 통계에서도 자주 사용됩니다.이 기사에서는 데이터웨어 하우스의 몇 가지 일반적인 시간 차원 통계 코드를 요약하고 독자가 참조하고 사용할 수 있도록 템플릿으로 추상화합니다.

 

추천

출처blog.csdn.net/godlovedaniel/article/details/109264067