¿Cuál es la implementación que no tiene Hive?
Supongamos que hay una tabla de inicio de sesión (registro de inicio de sesión del día, solo un uid) y una tabla de registro de usuarios (usuarios registrados del día, solo un uid en el campo), ambas tablas contienen un campo fluido.
En consulta
Si desea consultar a los usuarios registrados que iniciaron sesión el mismo día, debe utilizar in para consultar. hive sql es el siguiente:
Seleccione iniciar sesión .uid desde iniciar sesión a la izquierda para unirse a regusers en login.uid = regusers.uid, donde regusers.uid no está vacío
Si La tabla de inicio de sesión y la tabla de regusers están divididas por día y el campo es dt. Luego consulte a los usuarios registrados que iniciaron sesión en 2013 1. hive sql es el siguiente:
Seleccione login.uid del inicio de sesión day_login unión externa izquierda
(seleccione uid de regusers donde dt='20130101') day_regusers
en day_log in.uid = day_regusers.uid donde day_log in.dt='20130101' y day_regusers.uid no está vacío
No en la consulta
Si desea consultar el antiguo Los usuarios que iniciaron sesión el mismo día (suponiendo que el usuario registrado sea un usuario anterior el mismo día), deben utilizar not in para realizar la consulta. hive sql es el siguiente:
seleccione iniciar sesión. uid desde el inicio de sesión a la izquierda para unirse a los regusers al iniciar sesión. uid = regusers.uid donde regusers está vacío;
Si inicia sesión. La tabla y la tabla de regusers están divididas por día y el campo es dt. Luego consulte a los usuarios antiguos que iniciaron sesión en 2013 1. hive sql es el siguiente:
Seleccione login.uid del inicio de sesión day_login unión externa izquierda
(seleccione uid de regusers donde dt='20130101') day_regusers
el día _ iniciar sesión uid = day_regusers.uid donde el día _ iniciar sesión dt = '20130101' y el día _ regusers está vacío
Optimización de la conexión de Hive
==. ================================================= == =====
A través
Existen grandes diferencias entre Hive y las bases de datos relacionales tradicionales en los escenarios comerciales y la arquitectura técnica subyacente. Por lo tanto, es posible que algunas habilidades del mundo de las bases de datos tradicionales ya no se apliquen a Hive. Acerca de; en todas partes; acerca de
Se han publicado uno tras otro artículos sobre la optimización, los principios y las aplicaciones de Hive, pero la mayoría de ellos son teóricos. Este artículo utiliza un ejemplo para profundizar gradualmente la comprensión de Hive.
Comprensión y concienciación sobre la optimización.
Requisito 1
Simplifiqué el requisito, es muy sencillo.
Las dos tablas se unen y la ciudad especificada y el pv diario se escriben en SQL RDBMS tradicional, de la siguiente manera:
1
2
三< / p>
Cuatro
Cinco
Seis
Siete
Ocho
Nueve
10
11
Seleccione t.statdate,
c.cname,
count(t.cookieid)
p>Desde tmpdb.city c
Agregar datos EC. flujo ext_track t ON (t . area 1 = c . cname
o t.area2 =c .cname
o t.area3 = c.cname)
donde t.statdate & gt='20140818' y t.statdate & lt='20140824'
Plataforma ="PC"
Grupo por t.statdate,
c.cname
¿Cómo te va últimamente? ¿Es posible comprender los requisitos basados en SQL?
2. Problema de conexión en espera
Luego pegue este SQL en Hive para ejecutarlo, luego encontrará que se informa el error:
1
Error: SemanticException [Error 10019]: Línea 5: 32 o no es compatible con la unión "cname" actual
Esto se debe a que Hive está limitado por el modelo de algoritmo MapReduce y solo admite etc. conexión de valor. Para lograr la unión no equivalente mencionada anteriormente, puede lograrla mediante el producto cartesiano completo:
1
2
三
Cuatro
Cinco
Seis
Siete
Ocho
Nueve
10
11
12
13
Seleccione t.statdate,
c.cname,
p>
Contar(t.cookieid)
Desde tmpdb.city c
Únase a ecdata.ext_trackflow t
donde t.statdate & gt='20140818'
y t.statdate & lt='20140824'
plataforma="PC"
y (t.area1= c.cname
O t.area2 = c.cname
o t.area3 = c.cname)
Agrupar por t.statdate,
c.cname
Luego ejecuta esta oración.
3. Optimización: reducir las uniones laterales y los productos cartesianos
Si realmente pones esta oración en Hive y tienes una tabla muy grande, te felicito. . . El administrador del clúster puede notar que tiene problemas. . .
Recordatorio: utilice el producto cartesiano con precaución en Hive. Conoce el resultado del mapeo m * n en escenarios de big data. . . En este sentido, Hive proporciona específicamente una variable de entorno: Hive .map red mode = estricto; impide la ejecución del producto cartesiano
1
Error: SemanticException [Error 10052]: En modo estricto no se permiten productos cartesianos. Si realmente quieres hacer eso, configura hive.mapred.mode=nonstrict
De la observación en 2, sabemos que seguiremos la unión después.
Condición, tome reducir la unión de bordes, si sigue dónde, tome el producto cartesiano, pero aquí hay un solo sql.
No hay forma de implementar la conexión lateral reducida.
¿Hay alguna otra manera?
4. Reescribe la conexión desigual: unión todo.
Dado que no se permiten uniones desiguales, cambiemos nuestra forma de pensar y realicemos una unión de consultas a través de múltiples subconsultas, y luego resumamos de la siguiente manera:
1
2
Tres
Cuatro
Cinco
Seis
Siete
Ocho p>
Nueve
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Seleccione dt,
Nombre,
Contar (cid )
Desde
(seleccione t.statdate dt,
c.cname nombre,
t.cookieid cid
Desde tmpdb.city c
Agregar datos e. text _ track flow t ON t . '20140818'
AND t.statdate & lt='20140824'
PLATFORM="PC"
UNION ALL SELECT t.statdate dt,
c.cname nombre,
t.cookieid cid
de tmpdb.city c
Agregar ecdata.ext_trackflow t en t.area2 =c .cname
Donde t.statdate & gt='20140818'
Y t.statdate & lt='20140824'
Plataforma="PC" p>
UNION ALL SELECT t.statdate dt,
c.cname nombre,
t.cookieid cid
de tmpdb.city c p>
Agregue ecdata.ext_trackflow t en t.area3 =c.cname
donde t.statdate & gt='20140818'
y t.statdate & lt=' 20140824 '
y plataforma = 'PC') tmp _ track flow
Agrupar por dt,
Nombre;
5. : Conexión del lado del mapa
La declaración anterior es una conexión del lado reducido.
Según nuestras necesidades y negocio, tmpdb.city es una tabla de diccionario que contiene una pequeña cantidad de datos, por lo que podemos intentar reescribir la declaración anterior como mapjoin:
1
2
p>Tres
Cuatro
Cinco
Seis
Siete
Ocho
Nueve
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 p>
28
29
30
Seleccione dt,
Nombre,
Contar (cid)
Desde
(SELECT/*+map join(c)*/t.statdate dt,
c.cname nombre,
t.cookieid cid
De tmpdb.city c
Agregar datos e. text_track flow t ON t . >
donde t.statdate & gt='20140818'
y t.statdate & lt='20140824'
Plataforma="PC"
UNION ALL SELECT /*+map join(c)*/t .statdate dt,
c.cname nombre,
t.cookieid cid
de tmpdb .city c
Agregue ecdata.ext_trackflow t a t.area2 =c.cname
donde t.statdate & gt='20140818'
y t. statdate & lt='20140824'
Plataforma="PC"
UNION ALL SELECT/*+map join(c)*/t .statdate dt,
c .cname nombre,
t.cookieid cid
de tmpdb.city c
Agregar ecdata.ext_trackflow t en t.area3 =c.cname
p>donde t.statdate & gt='20140818'
y t.statdate & lt='20140824'
y plataforma='PC') tmp_track flujo
Agrupar por dt,
Nombre
6. Optimización sin restricciones: activa el paralelismo y controla la cantidad de reducción.
Al ejecutar la declaración anterior, puede ver el plan de ejecución y la información de estado. Combinado con su declaración union all, puede ver que no hay dependencia entre las tres declaraciones union, pero en realidad se pueden ejecutar. en paralelo:
1
2
Tres
Cuatro
Cinco
Seis
p>
Siete
Ocho
Nueve
10
11
12
13
14
15
Explica SQL...
...
Relevancia de la fase:
La fase 11 es la fase raíz
La fase 1 depende de la fase:Fase-11
Fase- 2 depende de la fase: Fase 1
La Fase 3 depende de las fases: Fase 2, Fase 6, Fase 9
La Fase 12 es la fase raíz
La fase 5 depende de las fases: Fase 12
La fase 6 depende de la fase: fase 5
La fase 13 es la fase raíz
La fase 8 depende de fase: fase-13
La etapa 9 depende de la etapa: Etapa 8
La etapa 0 es la etapa raíz
...
Agregamos las siguientes opciones de variables de entorno antes del SQL:
1
2
Establecer tareas asignadas = 60; set hive . exec . paralelo = true;
Deje que las etapas 11, 12 y 13 del plan de ejecución se ejecuten en paralelo y controlen el número de tareas de reducción.
La declaración completa es la siguiente:
1
2
Tres
Cuatro
Cinco
Seis
Siete
Ocho
Nueve
10
11
12
13
14
15
16
17
p>18
19
20
21
22
23
24
25
26
27
28
29 p>
30
31
32
33
34
35
36
37
38
39
hive-e"
Establecer mapeado. reducir . tareas = 60 ;
SET exec . paralelo = TRUE;
Seleccione dt,
Nombre,
Recuento (cid). )
Desde
(SELECT/*+map join(c)*/t.statdate dt,
c.cname nombre,
t. cookieid cid
de tmpdb.city c
unir e datos .text_track flow t ON t . donde t.statdate & gt='20140818'
y t.statdate & lt='20140824'
plataforma="PC"
UNION ALL SELECT/ *+map join (c) */t .statdate dt,
c.cname nombre,
t.cookieid cid
de tmpdb.city c
Agregue ecdata.ext_trackflow t en t.area2 =c.cname
Donde t.statdate & gt='20140818'
y t.statdate & lt= '20140824'
Plataforma="PC"
UNION ALL SELECT/*+map join(c)*/t .statdate dt,
c.cname nombre,
t.cookieid cid
De tmpdb.city c
Agregar ecdata.ext_trackflow t a t.area3 =c.cname
donde t.statdate & gt='20140818'
y t.statdate & lt='20140824'
y plataforma ='PC') flujo tmp_track
Agrupar por dt,
Nombre;
“& gta1.txt
El efecto de optimización final es: la declaración en 2 no tiene resultados durante tres horas . . . 5 es aproximadamente 8 veces más rápido que 4, 6 es aproximadamente 2 veces más rápido que 5 y el resultado final es 10 minutos.