nginx+flume registro de tráfico de red análisis de datos en tiempo real combate real

Directorio de artículos

nginx+flume registro de tráfico de red análisis de datos en tiempo real combate real

Análisis de datos de registro de tráfico de red: descripción general

A excepción de los sitios web gubernamentales y de bienestar público, el propósito de la mayoría de los sitios web es generar ingresos monetarios o, para decirlo sin rodeos, ganar dinero. Para crear un sitio web que los usuarios necesitan, es necesario realizar un análisis del sitio web.A través del análisis, descubra las necesidades reales de los usuarios y construya un sitio web que satisfaga las necesidades de los usuarios.
El análisis de sitios web puede ayudar a los administradores de sitios web, operadores, personal de promoción, etc. a obtener información sobre el tráfico del sitio web en tiempo real y proporcionar una base de datos para el análisis del sitio web desde varios aspectos, como las fuentes de tráfico, el contenido del sitio web y las características de los visitantes del sitio web. De este modo, ayudamos a aumentar el tráfico del sitio web, mejorar la experiencia del usuario del sitio web, permitir que más visitantes se establezcan y se conviertan en miembros o clientes, y maximizar los ingresos con menos inversión.

imagen-20230511161321733

Análisis de datos de registro de tráfico de red: flujo de procesamiento de datos

El proceso general de análisis de datos de registro de tráfico del sitio web se basa básicamente en el flujo de procesamiento de datos. En general, se puede resumir como: de dónde vienen los datos y hacia dónde van los datos, que se puede dividir en los siguientes pasos principales:

imagen-20230511161343764

Análisis de datos de registro de tráfico de red: adquisición de datos

archivos de registro del sitio web

El método de registro de archivos de registro del sitio web es el método de adquisición de datos más primitivo, que se completa principalmente en el lado del servidor. Se puede realizar configurando la función de escritura de registro correspondiente en el servidor de aplicaciones del sitio web. Muchos servidores de aplicaciones web tienen sus propios función de registro de registro. Como los registros access.log de Nginx, etc.

imagen-20230511161409425

Inicie el servidor nginx:

/usr/local/nginx/sbin/nginx

/usr/local/nginx/sbin/nginx -s stop #Detener el servidor.

Acceso vía navegador: http://192.168.88.100/

imagen-20230511161448905

Actualice la página para ver la información de registro:

[root@node1 logs]# tail -f /usr/local/nginx/logsaccess.log        
192.168.88.1 - - [03/Feb/2021:16:50:15 +0800] "GET /img/zy03.jpg HTTP/1.1" 200 90034 "http://192.168.88.100/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
192.168.88.1 - - [03/Feb/2021:16:50:15 +0800] "GET /img/title2.jpg HTTP/1.1" 200 1703 "http://192.168.88.100/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
Chrome/87.0.4280.66 Safari/537.36"

Explicación del campo de registro

1、访客ip地址:   58.215.204.118
2、访客用户信息:  - -
3、请求时间:[18/Sep/2018:06:51:35 +0000]
4、请求方式:GET
5、请求的url:/wp-includes/js/jquery/jquery.js?ver=1.10.2
6、请求所用协议:HTTP/1.1
7、响应码:304
8、返回的数据流量:0
9、访客的来源url:http://blog.fens.me/nodejs-socketio-chat/
10、访客所用浏览器:Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0

Análisis de datos de registro de tráfico de red-recopilación de datos-marco Flume

Descripción general del canal

Flume es un software de alta disponibilidad, alta fiabilidad y distribución para la recopilación, agregación y transmisión masiva de registros proporcionado por Cloudera.
El núcleo de Flume es recopilar datos de la fuente de datos (fuente) y luego enviar los datos recopilados al destino especificado (sumidero). Para garantizar el éxito del proceso de entrega, los datos (canal) se almacenarán en caché antes de enviarse al destino (sumidero). Después de que los datos lleguen al destino (sumidero), Flume eliminará los datos almacenados en caché.
Actualmente hay dos versiones de Flume. La versión Flume 0.9X se denomina colectivamente Flume OG (generación original), y la versión Flume 1.X se denomina colectivamente Flume NG (próxima generación). Dado que Flume NG se sometió a componentes centrales, configuración central y refactorización de arquitectura de código, es muy diferente de Flume OG, así que preste atención a la distinción cuando lo use. Otra razón para el cambio es incorporar Flume en el paraguas de apache, y Cloudera Flume pasó a llamarse Apache Flume.

imagen-20230511161709177

Mecanismo de operación de canal

La función central en el sistema Flume es el agente, que en sí mismo es un proceso Java que generalmente se ejecuta en el nodo de recopilación de registros.

imagen-20230511161734607

Cada agente es equivalente a un transmisor de datos, y hay tres componentes en su interior:
Fuente: fuente de recopilación, utilizada para conectarse con la fuente de datos para obtener datos;
Sumidero: lugar de hundimiento, el propósito de recopilar la transmisión de datos, utilizado para el siguiente nivel de agente Transferir datos o
transferir datos al sistema de almacenamiento final;
Canal: el canal de transmisión de datos dentro del agente, utilizado para transferir datos desde la fuente al sumidero;

Instalación y despliegue de canales

Flume se ha instalado en la máquina virtual proporcionada por el curso.

colección canal

Ahora recopile los datos de registro en HDFS.

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
 
# Describe/configure the source
#a1.sources.r1.type = exec
#a1.sources.r1.command = tail -F /usr/local/nginx/logs/access.log
#a1.sources.r1.channels = c1
 
a1.sources = r1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /usr/local/nginx/logs/access*.log
…..

Ejecutar recolección de canales

 /export/server/flume-1.8.0/bin/flume-ng agent -c conf -f /export/server/flume-1.8.0/conf/web_log.conf -n a1  -Dflume.root.logger=INFO,console

imagen-20230511161942509

Preprocesamiento de datos - limpieza

Los datos de registro recopilados por Flume no se pueden usar directamente para el análisis y se requiere preprocesamiento:
Requisitos de preprocesamiento:
1: Eliminar los datos de registro con una longitud de campo insuficiente
2: Eliminar los campos que no tienen sentido para el análisis
3: Convertir el formato de fecha
4: Sí El registro original los datos se cortan y el delimitador se especifica como '\001'
5: Marque las líneas válidas de los datos

数据清洗:
hadoop jar /export/data/mapreduce/web_log.jar cn.itcast.bigdata.weblog.pre.WeblogPreProcess   

Análisis de datos de registro de tráfico de red: datos del modelo de flujo de clics

concepto de flujo de clics

Click Stream (Stream de clics) se refiere a la pista de visitas continuas del usuario en el sitio web. Prestar atención a todo el proceso de navegación de los usuarios por el sitio web. Cada visita de un usuario a un sitio web incluye una serie de acciones de clic, y estos datos de comportamiento de clic constituyen datos de flujo de clics, que representan todo el proceso de navegación del usuario por el sitio web.

imagen-20230511162032708

En el modelo de flujo de clics, hay dos tipos de datos del modelo: páginas vistas y visitas.

Vistas de página del modelo Clickstream

Los datos del modelo de páginas vistas se centran en cada 会话(session)identificación del usuario, así como en la cantidad de pasos visitados en cada sesión y el tiempo de permanencia de cada paso.
En el análisis de sitios web, generalmente se pone 前后两条访问记录时间差在30分钟以内算成一次会话. Si supera los 30 minutos, la próxima visita se cuenta como un nuevo inicio de sesión.
Los pasos generales son los siguientes:
busque todos los registros de acceso del usuario en todos los registros de acceso,
clasifique todos los registros de acceso del usuario en orden positivo de tiempo,
calcule si la diferencia de tiempo entre los dos registros antes y después es de 30 minutos
, si es inferior a 30 minutos, es la continuación de la misma sesión
Si es superior a 30 minutos, es el inicio de la siguiente sesión
Utilice la diferencia de tiempo entre los dos registros antes y después para calcular el tiempo de permanencia del paso anterior
El último paso y el negocio con un solo paso especifican un tiempo de permanencia en la página de 60s por defecto.

--得到pageviews模型
hadoop jar /export/data/mapreduce/web_log.jar  cn.itcast.bigdata.weblog.clickstream.ClickStreamPageView   

Visitas del modelo Clickstream

El modelo Visitas se centra en la información de inicio y finalización de la visita en cada sesión. Por ejemplo, en una determinada sesión, el usuario ingresa la página de inicio y la hora de inicio de la sesión, de qué página salió el usuario cuando finalizó la sesión, la hora de salida, cuántas páginas visitó la sesión en total y otra información.
Los pasos generales son los siguientes:
Clasificación en el modelo de páginas vistas
Todos los registros de acceso en cada sesión de reciclaje se clasifican en orden positivo de tiempo La
página de tiempo del primer día es la página de tiempo de inicio
La empresa especifica la página de tiempo del último registro como la hora de salida y la página de salida.

得到visits模型
hadoop jar /export/data/mapreduce/web_log.jar cn.itcast.bigdata.weblog.clickstream.ClickStreamVisit    

Análisis de datos de registro web: carga de datos

Para el análisis de datos de registro, Hive también se divide en tres capas: capa ods, capa dw, capa de aplicación

crear base de datos

create database if not exists  web_log_ods;
create database if not exists  web_log_dw;
create database if not exists  web_log_app;

Crear tabla de datos de capa ODS

tabla de datos de registro sin procesar

drop table if exists web_log_ods.ods_weblog_origin;
  create table web_log_ods.ods_weblog_origin(
  valid string , --有效标记
  remote_addr string, --访客ip
  remote_user string, --访客用户信息
  time_local string, --请求时间
  request string,  --请求url
  status string, --响应状态码
  body_bytes_sent string, --响应字节数
  http_referer string, --来源url
  http_user_agent string --访客终端信息
  ) 
  partitioned by (dt string)
  row format delimited fields terminated by '\001';

tabla de páginas vistas del modelo de flujo de clics

drop table if exists web_log_ods.ods_click_pageviews;
create table  web_log_ods.ods_click_pageviews(
session string, --会话id
remote_addr string, --访客ip
remote_user string, --访客用户信息
time_local string, --请求时间
request string, --请求url
visit_step string, --访问步长
page_staylong string, --页面停留时间(秒)
http_referer string, --来源url
http_user_agent string,--访客终端信息
body_bytes_sent string,--响应字节数
status string --响应状态码
)
partitioned by (dt string)
row format delimited fields terminated by '\001';

Tabla de modelos de visitas de flujo de clics

drop table if exists web_log_ods.ods_click_stream_visits;
create table web_log_ods.ods_click_stream_visits(
session     string, --会话id
remote_addr string, --访客ip
inTime      string, --会话访问起始时间
outTime     string, --会话访问离开时间
inPage      string, --会话访问起始页面
outPage     string, --会话访问离开页面
referal     string, --来源url
pageVisits  int --会话页面访问数量
)
partitioned by (dt string)
row format delimited fields terminated by '\001';

Carga de datos de la tabla

load data inpath '/output/web_log/pre_web_log' overwrite into table  web_log_ods.ods_weblog_origin partition(dt='2021-02-01');
 
load data inpath '/output/web_log/pageviews'overwrite into table web_log_ods.ods_click_pageviews partition(dt='2021-02-01');
 
load data inpath '/output/web_log/visits' overwrite into table web_log_ods.ods_click_stream_visits partition(dt='2021-02-01');

Análisis de datos de registro de red: implementación de tabla detallada y tabla amplia

concepto

En los datos de la tabla de hechos, algunos atributos juntos forman un campo (combinados entre sí), como el año, mes, día, hora, minuto y segundo constituyen el tiempo. Cuando se requiere agrupar estadísticas en función de un determinado atributo, las operaciones tales como interceptación y empalme son requeridos Eficiencia extremadamente baja.

Para facilitar el análisis, un campo de la tabla de hechos se puede cortar y extraer para formar un nuevo campo. Debido a que hay más campos, se denomina tabla ancha y la original se convierte en una tabla estrecha.
Y debido a que la información en la tabla ancha es más clara y detallada, también se la puede llamar tabla detallada.

drop table web_log_dw.dw_weblog_detail;
create table web_log_dw.dw_weblog_detail(
valid           string, --有效标识
remote_addr     string, --来源IP
remote_user     string, --用户标识
time_local      string, --访问完整时间
daystr          string, --访问日期
timestr         string, --访问时间
month           string, --访问月
day             string, --访问日
hour            string, --访问时
request         string, --请求的url
status          string, --响应码
body_bytes_sent string, --传输字节数
http_referer    string, --来源url
ref_host        string, --来源的host
ref_path        string, --来源的路径
ref_query       string, --来源参数query
ref_query_id    string, --来源参数query的值
http_user_agent string --客户终端标识
)
partitioned by(dt string)
row format delimited fields terminated by '\001';

Inserte datos en la tabla amplia detallada dw_weblog_detail consultando, aquí debe usar la función integrada parse_url_tuple en Hive para analizar la URL y almacenar el siguiente sql en: /export/data/hive_sql/web_log_detail.sql

insert into table web_log_dw.dw_weblog_detail partition(dt='2021-02-01')
select c.valid,c.remote_addr,c.remote_user,c.time_local,
substring(c.time_local,1,10) as daystr,
substring(c.time_local,12) as tmstr,
substring(c.time_local,6,2) as month,
substring(c.time_local,9,2) as day,
substring(c.time_local,12,2) as hour,
c.request,c.status,c.body_bytes_sent,c.http_referer,c.ref_host,c.ref_path,c.ref_query,c.ref_query_id,c.http_user_agent
from
(SELECT
a.valid,a.remote_addr,a.remote_user,a.time_local,
a.request,a.status,a.body_bytes_sent,a.http_referer,a.http_user_agent,b.ref_host,b.ref_path,b.ref_query,b.ref_query_id
FROM web_log_ods.ods_weblog_origin a LATERAL VIEW
parse_url_tuple(regexp_replace(http_referer, "\"", ""), 'HOST', 'PATH','QUERY', 'QUERY:id') b as ref_host, ref_path, ref_query,
 ref_query_id) c;

Ejecute la extracción de sql para convertir campos a la tabla intermedia t_ods_tmp_detail hive -f '/export/data/hive_sql/web_log_detail.sql'

Análisis de datos de registro de red: desarrollo de indicadores de datos de capa de aplicación

Análisis de indicadores básicos

--浏览页面次数(pv) 
select count(*) as pvs from  web_log_dw.dw_weblog_detail where valid = true and dt='2021-02-01';
 
 --独立访客(uv)
 select count(distinct remote_addr) as uvs from  web_log_dw.dw_weblog_detail where valid = true and dt='2021-02-01';
 
 --访问次数(vv) 
select count(session) from ods_click_stream_visits where  dt='2021-02-01' 


Almacenamiento de índice básico

--基础指标入库
drop table if exists web_log_app.app_webflow_basic_info;
create table web_log_app.app_webflow_basic_info(date_val string,pvs bigint,uvs bigint,vvs bigint) partitioned by(dt string);
 
--允许笛卡尔积
set spark.sql.crossJoin.enabled=true;
 
insert into table web_log_app.app_webflow_basic_info partition(dt='2021-02-01')
select '2021-02-01',a.*,b.* from
( 
   select count(*) as pvs,count(distinct remote_addr) as uvs from web_log_dw.dw_weblog_detail  where dt='2021-02-01'
) a 
join 
(
 select count(session) as vvs from web_log_ods.ods_click_stream_visits where dt='2021-02-01'
) b;

Análisis de indicadores básicos - análisis multidimensional

--计算该处理批次(一天)中的各小时pvs
drop table web_log_app.app_pvs_everyhour_oneday;
create table web_log_app.app_pvs_everyhour_oneday(month string,day string,hour string,pvs bigint) partitioned by(dt string);
 
insert into table web_log_app.app_pvs_everyhour_oneday partition(dt='2021-02-01')
select a.month as month,a.day as day,a.hour as hour,count(*) as pvs from web_log_dw.dw_weblog_detail  a
where  a.dt='2021-02-01' group by a.month,a.day,a.hour;
 
--计算每天的pvs
drop table web_log_app.app_pvs_everyday;
create table web_log_app.app_pvs_everyday(pvs bigint,month string,day string);
 
insert into table web_log_app.app_pvs_everyday
select count(*) as pvs,a.month as month,a.day as day from web_log_dw.dw_weblog_detail  a
group by a.month,a.day;

Análisis de índice compuesto

--复合指标统计分析
 
--人均浏览页数(平均访问深度)
 --需求描述:统计今日所有来访者平均请求的页面数。
 --总页面请求数pv/去重总人数uv
 
drop table web_log_app.app_avgpv_user_everyday;
create table web_log_app.app_avgpv_user_everyday(
day string,
avgpv string);
        
 
--方式一:
insert into table web_log_app.app_avgpv_user_everyday
select '2021-02-01',pv/uv from web_log_app.app_webflow_basic_info;
 
--方式二:
 
insert  into table web_log_app.app_avgpv_user_everyday
select '2021-02-01',sum(b.pvs)/count(b.remote_addr) from
(select remote_addr,count(*) as pvs from web_log_dw.dw_weblog_detail where dt='2021-02-01' group by remote_addr) b;


--平均访问时长
 
    --平均每次访问(会话)在网站上的停留时间。
    --体现网站对访客的吸引程度。
    --平均访问时长=访问总时长/访问次数。
 
--先计算每次会话的停留时长
 
select session, sum(page_staylong) as web_staylong from web_log_ods.ods_click_pageviews where dt='2021-02-01'
group by session;
 
 
--计算平均访问时长
select
sum(a.web_staylong)/count(a.session)
from 
(select session, sum(page_staylong) as web_staylong from web_log_ods.ods_click_pageviews where dt='2021-02-01'
group by session) a;


Análisis de índice compuesto-topn

--热门页面统计
--统计最热门的页面top10
 
drop table web_log_app.app_hotpages_everyday;
create table web_log_app.app_hotpages_everyday(day string,url string,pvs string);
 
--方式1
insert into table web_log_app.app_hotpages_everyday
select '2021-02-01',a.request,a.request_counts from
(select request as request,count(request) as request_counts 
from web_log_dw.dw_weblog_detail where dt='2021-02-01' group by request having request is not null
) a
order by a.request_counts desc limit 10;
 
--方式2
insert into table web_log_app.app_hotpages_everyday
select * from
(
SELECT 
  '2021-02-01',a.request,a.request_counts,
  RANK() OVER( ORDER BY a.request_counts desc) AS rn 
  FROM 
  (
    select request as request,count(request) as request_counts 
    from web_log_dw.dw_weblog_detail where dt='2021-02-01' group by request having request is not null
  )a
)b
where b.rn <= 10
 ;

Análisis de índice compuesto-Modelo de embudo-Análisis de conversión

La conversión se refiere a un canal cerrado en el proceso comercial del sitio web, que guía a los usuarios a seguir el proceso para finalmente alcanzar los objetivos comerciales (como las transacciones de productos); en este canal, esperamos que los visitantes avancen todo el camino sin mirar hacia atrás. o salir hasta que se complete el objetivo de conversión. El modelo de embudo se refiere a la descripción de la imagen de la pérdida gradual de usuarios que ingresan al canal durante el proceso progresivo de cada enlace.

imagen-20230511162916858

análisis de la demanda

En un proceso comercial específico, averigüe la cantidad de personas que completan cada paso y el porcentaje relativo al paso anterior.

imagen-20230511163010877

定义好业务流程中的页面标识,下例中的步骤为:
Step1、  /item
Step2、  /category
Step3、  /index
Step4、  /order
load data local inpath '/export/data/hivedatas/click-part-r-00000' overwrite into table web_log_ods.ods_click_pageviews2 partition(dt='2021-02-01');
 

---1、查询每一个步骤的总访问人数
UNION All将多个SELECT语句的结果集合并为一个独立的结果集
 
create table web_log_app.app_oute_numbs as 
select 'step1' as step,count(distinct remote_addr)  as numbs from web_log_ods.ods_click_pageviews where dt='2021-02-01' and request like '/item%'
union all
select 'step2' as step,count(distinct remote_addr)  as numbs from  web_log_ods.ods_click_pageviews where dt='2021-02-01' and request like '/category%'
union all
select 'step3' as step,count(distinct remote_addr)  as numbs from  web_log_ods.ods_click_pageviews where dt='2021-02-01' and request like '/order%'
union all
select 'step4' as step,count(distinct remote_addr)  as numbs from  web_log_ods.ods_click_pageviews where dt='2021-02-01' and request like '/index%';


resultado de búsqueda:

+---------------------+----------------------+--+
| dw_oute_numbs.step  | dw_oute_numbs.numbs  |
+---------------------+----------------------+--+
| step1               | 1029                 |
| step2               | 1029                 |
| step3               | 1028                 |
| step4               | 1018                 |
+---------------------+----------------------+--+

–2.Consulta la relación de cada paso con el número de personas en el punto de inicio del camino


--级联查询,自己跟自己join
 
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from web_log_app.app_oute_numbs rn
inner join 
web_log_app.app_oute_numbs rr;

El resultado después de la unión se muestra en la siguiente figura:


+---------+----------+---------+----------+--+
| rnstep  | rnnumbs  | rrstep  | rrnumbs  |
+---------+----------+---------+----------+--+
| step1   | 1029     | step1   | 1029     |
| step2   | 1029     | step1   | 1029     |
| step3   | 1028     | step1   | 1029     |
| step4   | 1018     | step1   | 1029     |
| step1   | 1029     | step2   | 1029     |
| step2   | 1029     | step2   | 1029     |
| step3   | 1028     | step2   | 1029     |
| step4   | 1018     | step2   | 1029     |
| step1   | 1029     | step3   | 1028     |
| step2   | 1029     | step3   | 1028     |
| step3   | 1028     | step3   | 1028     |
| step4   | 1018     | step3   | 1028     |
| step1   | 1029     | step4   | 1018     |
| step2   | 1029     | step4   | 1018     |
| step3   | 1028     | step4   | 1018     |
| step4   | 1018     | step4   | 1018     |
+---------+----------+---------+----------+--+

--每一步的人数/第一步的人数==每一步相对起点人数比例
select tmp.rnstep,tmp.rnnumbs/tmp.rrnumbs as abs_rate
from
(
  select 
   * 
 from 
   web_log_app.app_oute_numbs t1 
 join 
   web_log_app.app_oute_numbs t2
 on t2.step = 'step1';
) tmp 
tmp
+---------+----------+---------+----------+--+
| rnstep  | rnnumbs  | rrstep  | rrnumbs  |
+---------+----------+---------+----------+--+
| step1   | 1029     | step1   | 1029     |
| step2   | 1029     | step1   | 1029     |
| step3   | 1028     | step1   | 1029     |
| step4   | 1018     | step1   | 1029     |

–3 Consultar la tasa de fuga de cada paso en relación con el paso anterior


--首先通过自join表过滤出每一步跟上一步的记录
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from web_log_app.app_oute_numbs rn
inner join 
web_log_app.app_oute_numbs rr
where cast(substr(rn.step,5,1) as int)=cast(substr(rr.step,5,1) as int)-1;
 
 
注意:cast为Hive内置函数 类型转换
select cast(1 as float); --1.0  
select cast('2016-05-22' as date); --2016-05-22 
 
 
+---------+----------+---------+----------+--+
| rnstep  | rnnumbs  | rrstep  | rrnumbs  |
+---------+----------+---------+----------+--+
| step1   | 1029     | step2   | 1029     |
| step2   | 1029     | step3   | 1028     |
| step3   | 1028     | step4   | 1018     |
+---------+----------+---------+----------+--+

– Entonces es muy simple calcular la tasa de fuga de cada paso en relación con el paso anterior


select tmp.rrstep as step,tmp.rrnumbs/tmp.rnnumbs as abs_rate
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from web_log_app.app_oute_numbs rn
inner join 
web_log_app.app_oute_numbs rr) tmp
where cast(substr(tmp.rnstep,5,1) as int)=cast(substr(tmp.rrstep,5,1) as int)-1;
 


crear tabla de resultados

drop table if exists web_log_app.app_bounce_rate;
create table web_log_app.app_bounce_rate 
(
 step_num string,
 numbs bigint,
 abs_rate double,
 leakage_rate double
);

insert into table web_log_app.app_bounce_rate 
select abs.step,abs.numbs,abs.rate as abs_rate,rel.leakage_rate as leakage_rate
from 
(
select tmp.rnstep as step,tmp.rnnumbs as numbs,tmp.rnnumbs/tmp.rrnumbs * 100 as rate
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from web_log_app.app_oute_numbs rn
inner join 
web_log_app.app_oute_numbs rr) tmp
where tmp.rrstep='step1'
) abs
left outer join
(
select tmp.rrstep as step,tmp.rrnumbs/tmp.rnnumbs * 100 as leakage_rate
from
(
select rn.step as rnstep,rn.numbs as rnnumbs,rr.step as rrstep,rr.numbs as rrnumbs  from web_log_app.app_oute_numbs rn
inner join 
web_log_app.app_oute_numbs rr) tmp
where cast(substr(tmp.rnstep,5,1) as int)=cast(substr(tmp.rrstep,5,1) as int)-1
) rel
on abs.step=rel.step;

Crear tabla de resultados mysql


CREATE DATABASE web_log_result;
drop table if exists web_log_result.app_webflow_basic_info;
CREATE TABLE web_log_result.app_webflow_basic_info(MONTH VARCHAR(50),DAY VARCHAR(50),pv BIGINT,uv BIGINT,ip BIGINT,vv BIGINT);
 
 
 --Sqoop数据导出
/export/server/sqoop-1.4.7/bin/sqoop export \
--connect jdbc:mysql://192.168.88.100:3306/web_log_result \
--username root \
--password 123456 \
--table app_webflow_basic_info \
--input-fields-terminated-by '\001' \
--export-dir /user/hive/warehouse/web_log_app.db/app_webflow_basic_info/dt=2021-02-01


Supongo que te gusta

Origin blog.csdn.net/xianyu120/article/details/130625395
Recomendado
Clasificación