Cálculo del índice de capa de anuncios de almacenamiento de datos de desarrollo de big data

Los datos de la capa de anuncios suelen ser los datos del indicador de resultado final, que se utilizan en la visualización en pantalla grande o en el procesamiento de transmisiones en tiempo real. Utilice los dos ejemplos siguientes para practicar cómo escribir SQL empresarial para visualización en pantalla grande.

1. Caso de análisis de miembros

1.1 Preparación de datos

La estructura de la tabla es la siguiente, donde esta tabla es una tabla de miembros de la capa dws con el día como dimensión, como un resumen de la información diaria de los miembros,

use dws;
drop table if exists dws.dws_member_start_day;
create table dws.dws_member_start_day(
`device_id` string, -- 设备id,来区分用户
`uid` string, -- uid
`app_v` string,
`os_type` string,
`language` string,
`channel` string,
`area` string,
`brand` string
) COMMENT '会员日启动汇总'
partitioned by(dt string)
stored as parquet;

1.2 Cálculo del índice de miembros

La definición de un miembro silencioso : la aplicación solo se inicia el día de la instalación y el tiempo de instalación es hace 7 días.

Definición de miembros perdidos : miembros que no han iniciado sesión en los últimos 30 días

1.2.1 Cómo calcular el número de miembros silenciosos

-- 拿到只启动一次的会员,后面再过滤安装时间是再7天前的,使用sum 窗口函数
SELECT count(*)
FROM
  (SELECT device_id,
          sum(device_id) OVER (PARTITION BY device_id) AS sum_num,
                     dt
   FROM dws.dws_member_start_day) tmp
WHERE dt <= date_add(CURRENT_DATE, -7)
  AND sum_num=1

1.2.2 Cómo calcular el número de miembros perdidos

-- 拿到会员最近一次登录时间,并用row_number来过滤
SELECT count(*)
FROM
  (SELECT device_id,
          dt,
          row_number() OVER (PARTITION BY device_id
                             ORDER BY dt DESC) ro
   FROM dws.dws_member_start_day) tmp
WHERE ro=1
  AND dt >= date_add(CURRENT_DATE, -30) 

2. Casos de transacciones principales

2.1 Preparación de datos

Dada una tabla de dimensiones de pedidos diarios, la estructura de la tabla es la siguiente:

DROP TABLE IF EXISTS dwd.dwd_trade_orders;
create table dwd.dwd_trade_orders(
`orderId`    int,
`orderNo`   string,
`userId`    bigint,
`status`    tinyint,
`productMoney` decimal,
`totalMoney`  decimal,
`payMethod`   tinyint,
`isPay`     tinyint,
`areaId`    int,
`tradeSrc`   tinyint,
`tradeType`   int,
`isRefund`   tinyint,
`dataFlag`   tinyint,
`createTime`  string,
`payTime`   string,
`modifiedTime` string,
`start_date`  string,
`end_date`   string
) COMMENT '订单事实拉链表'
partitioned by (dt string)
STORED AS PARQUET;

Entre ellos, estado del pedido -3 usuario rechazado -2 pedido no pagado -1 usuario cancelado 0 pendiente de entrega 1 en entrega 2 usuario confirma recepción, indicador de pedido válido -1 eliminado 1 válido

El preprocesamiento de datos no es conveniente cuando se procesa la tabla de cremallera de datos detallados. Puede hacer una tabla intermedia. dws_trade_orders_dayLa estructura y el procesamiento de la tabla son los siguientes:

DROP TABLE IF EXISTS dws.dws_trade_orders_day;

CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_day(day_dt string COMMENT '日期:yyyy-MM-dd',
                                                   day_cnt decimal commnet '日订单笔数',
                                                   day_sum decimal COMMENT '日订单总额') COMMENT '日订单统计表';

SELECT dt,
       count(*) cnt,
       sum(totalMoney) sm
FROM
  (SELECT DISTINCT orderid,
                   dt,
                   totalMoney
   FROM dwd.dwd_trade_orders
   WHERE status >= 0
     AND dataFlag = '1') tmp
GROUP BY dt;


INSERT OVERWRITE TABLE dws.dws_trade_orders_day
SELECT dt,
       count(*) cnt,
       sum(totalMoney) sm
FROM
  (SELECT DISTINCT orderid,
                   dt,
                   totalMoney
   FROM dwd.dwd_trade_orders
   WHERE status >= 0
     AND dataFlag = '1') tmp
GROUP BY dt;


SELECT *
FROM dws.dws_trade_orders_day
WHERE day_dt BETWEEN '2020-01-01' AND '2020-12-31';

2.2 Indicador 1. Cuente el número de pedidos de venta y el total de pedidos en cada trimestre en 2020

Primero cree la tabla de indicadores de anuncios:dws_trade_orders_quarter

DROP TABLE IF EXISTS dws.dws_trade_orders_quarter;


CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_quarter(YEAR string COMMENT '年份',
                                                        QUARTER string COMMENT '季度',
                                                        cnt decimal COMMENT '订单总笔数',
                                                        SUM decimal COMMENT '订单总额') COMMENT '季度订单统计表';


INSERT OVERWRITE TABLE dws.dws_trade_orders_quarter WITH tmp AS
  (SELECT substr(day_dt, 0, 4) YEAR,
                               CASE WHEN substr(dat_dt, 6, 2)="01"
   OR substr(dat_dt, 6, 2)="02"
   OR substr(day_dt, 6, 2)="03" THEN "1" WHEN substr(dat_dt, 6, 2)="04"
   OR substr(dat_dt, 6, 2)="05"
   OR substr(day_dt, 6, 2)="06" THEN "2" WHEN substr(dat_dt, 6, 2)="07"
   OR substr(dat_dt, 6, 2)="08"
   OR substr(day_dt, 6, 2)="09" THEN "3" WHEN substr(dat_dt, 6, 2)="10"
   OR substr(dat_dt, 6, 2)="11"
   OR substr(day_dt, 6, 2)="12" THEN "4" AS QUARTER day_cnt,
                                     day_sum
   FROM dws.dws_trade_orders_day)
SELECT YEAR,
       QUARTER,
       sum(day_cnt),
       sum(day_sum)
FROM tmp
GROUP BY YEAR QUARTER;

2.3 Cuente el número de pedidos de venta y el monto total del pedido para cada mes en 2020

Primero cree la tabla de indicadores de anuncios:dws_trade_orders_month

DROP TABLE IF EXISTS dws.dws_trade_orders_month;

CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_month(yearstring COMMENT '年份',
                                                      MONTH string COMMENT '月份',
                                                      month_cnt decimal COMMENT '月订单总笔数',
                                                      month_sum decimal COMMENT '月订单总额') COMMENT '月订单统计表';


INSERT OVERWRITE TABLE dws.dws_trade_orders_month WITH tmp AS
  (SELECT substr(day_dt, 0, 4) YEAR,
                               sunstr(day_dt, 6, 2) MONTH,
                                                    day_cnt,
                                                    day_sum
   FROM dws.dws_trade_orders_day)
SELECT YEAR,
       MONTH,
       sum(day_cnt) month_cnt,
       sum(day_sum) month_sum
FROM tmp
GROUP BY YEAR,
         MONTH;

2.4 Cuente el número de pedidos de venta y el monto total del pedido por semana (de lunes a domingo) en 2020

Cree la tabla de indicadores de la capa de anuncios: dws_trade_orders_weekuse la función de fechaweekofyear

DROP TABLE IF EXISTS dws.dws_trade_orders_week;
CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_week(YEAR string COMMENT '年份',
                                                     WEEK string COMMENT '一年中的第几周',
                                                     week_cnt decimal COMMENT '周订单总笔数',
                                                     week_sum decimal COMMENT '周订单总额') COMMENT '周订单统计表';


INSERT OVERWRITE TABLE dws.dws_trade_orders_week
SELECT substr(day_dt, 0, 4) YEAR,
                            weekofyear(day_dt) WEEK,
                                               sum(day_cnt),
                                               sum(day_sum)
FROM dws.dws_trade_orders_day
GROUP BY substr(day_dt, 0, 4) YEAR,
                              weekofyear(day_dt) WEEK;

2.5 Contar el número de pedidos y el total de pedidos en días festivos, días de descanso y días laborables nacionales en 2020

Cree la tabla de dimensiones de información de fecha: dim_day_infoe ingrese los datos de información de vacaciones (los datos son diferentes cada año y se requiere un anuncio del Consejo de Estado, por lo que se mantiene manualmente con regularidad)

drop table if exists dim.dim_day_info;
create table if not exists dim.dim_day_info(
  day_dt string comment '日期',
  is_holidays int comment '节假日标识: 0不是 1是',
  is_workday int comment '工作日标识 0不是 1是'
) comment '日期信息表';
-- 统计2020节假日的订单笔数,订单总额

SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_holiday = 1;

-- 统计2020年休息日的订单笔数,订单总额

SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_workday = 0;

-- 统计2020节工作日的订单笔数,订单总额

SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_workday = 1;

Wu Xie, Xiao San Ye, un pequeño novato en segundo plano, big data e inteligencia artificial. Presta atención a másarchivo

Supongo que te gusta

Origin blog.csdn.net/hu_lichao/article/details/111147955
Recomendado
Clasificación