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
- Análisis de datos de registro de tráfico de red: flujo de procesamiento de datos
- Análisis de datos de registro de tráfico de red: adquisición de datos
- Análisis de datos de registro de tráfico de red-recopilación de datos-marco Flume
- Análisis de datos de registro de tráfico de red: datos del modelo de flujo de clics
- Análisis de datos de registro web: carga de datos
- Análisis de datos de registro de red: implementación de tabla detallada y tabla amplia
- Análisis de datos de registro de red: desarrollo de indicadores de datos de capa de aplicación
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.
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:
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.
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/
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.
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.
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
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.
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.
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.
定义好业务流程中的页面标识,下例中的步骤为:
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