Plantilla de desarrollo de código de estadísticas de resumen ETL (shell + sql) del almacén de datos por día, semana, mes y trimestre

Tabla de contenido

0 Prefacio

1 Resumen del uso de la fecha en el shell

1.1 Gramática básica

1.2 fecha muestra la hora actual

1.3 la fecha muestra la hora no actual

2 Estadísticas por día

3 Estadísticas por semana

4 Estadísticas mensuales

5 Estadísticas por trimestre

6 Resumen



0 Prefacio

Cuando se realizan estadísticas de ETL de almacenamiento de datos, a menudo necesitamos realizar estadísticas por lotes sobre los datos en varias dimensiones de tiempo, como día, semana, mes y trimestre. El modo de desarrollo general es en forma de sql en el shell, de modo que podemos ejecutar scripts de shell de acuerdo con las tareas cronometradas y, al mismo tiempo, usar el shell para escribir algunas funciones para reemplazar los procedimientos almacenados en SQL. Las dimensiones de tiempo de día, semana, mes y trimestre en este artículo también se calculan utilizando la función de tiempo en el shell, lo que reduce la dificultad del desarrollo de SQL y hace que el código sea más fácil de mantener.

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

1 Resumen del uso de la fecha en el shell

1.1 Gramática básica

1) Gramática básica

fecha [OPCIÓN] ... [+ FORMATO]

2) Descripción de la opción

Tabla 1-20

Opciones

Características

-d <cadena de tiempo>

Muestra la hora indicada por la "cadena de tiempo" especificada en lugar de la hora actual

-s <fecha y hora>

Establecer la fecha y hora del sistema

3) Descripción de parámetros

Tabla 1-21

parámetro

Características

<+ formato de fecha y hora>

Especifique el formato de fecha y hora utilizado al mostrar

1.2 fecha muestra la hora actual

1) Gramática básica

(1) fecha (descripción de la función: muestra la hora actual)

(2) fecha +% Y (Descripción de la función: muestra el año actual)

(3) fecha +% m (descripción de la función: muestra el mes actual)

(4) fecha +% d (Descripción de la función: muestra el día actual)

(5) fecha "+% Y-% m-% d% H:% M:% S" (Descripción de la función: mostrar año, mes, día, hora, minuto y segundo)

2) Práctica de casos

(1) Mostrar información de la hora actual

[root@bigdata-1 ~]# date

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

(2) Muestra la hora actual, año, mes y día.

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

20201026

(3) Muestra la hora actual año, mes, día, hora, minuto y segundo

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

2020-10-26 13:42:15

1.3 la fecha muestra la hora no actual

1) Gramática básica

(1) fecha -d 'hace 1 día' (Descripción de la función: muestra la hora del día anterior)

(2) fecha -d'-1 días atrás '(descripción de la función: mostrar la hora de mañana)

2) Práctica de casos

(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 fecha Establecer la hora del sistema

1) Gramática básica

       fecha -s cadena hora

2) Práctica de casos

       (1) Establecer la hora actual del sistema

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

2 Estadísticas por día

#!/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 Estadísticas por semana

#!/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 Estadísticas mensuales

#!/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 Estadísticas por trimestre

 Nota: Esta secuencia de comandos utiliza la operación de división del caparazón cuando se cuenta, y la división del caparazón se realiza con la calculadora bc, donde la escala es el número de lugares decimales y hay espacios en ambos lados. Cuando el shell calcula sumas, restas, multiplicaciones y divisiones, si es una operación de números enteros, generalmente se usa $ ((a + b)) o $ [a + b]. Si es una operación decimal, la calculadora bc es generalmente se usa para el cálculo, y el controlador de escala tiene el número de lugares decimales.

#!/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 Resumen

Varias plantillas de desarrollo de código en este artículo también se utilizan con frecuencia en estadísticas ETL reales. El artículo resume varios códigos de estadísticas de dimensión de tiempo comunes en almacenes de datos y los resume en plantillas para uso y referencia de los lectores.

 

Supongo que te gusta

Origin blog.csdn.net/godlovedaniel/article/details/109264067
Recomendado
Clasificación