join - Hive 0.13 mapa de acceso compartido
dictionary bucket (1)
Pude hacer que esto funcione eventualmente. Parece que tuvo algo que ver con hive.mapjoin.bucket.cache.size
.
Intenta configurar esto en un número más alto que el predeterminado (10 o 100, creo). Mi trabajo funciona bien de la siguiente manera:
SET hive.optimize.bucketmapjoin=true;
set hive.exec.reducers.max = 30000;
set hive.mapjoin.bucket.cache.size=100000000;
SELECT /*+MAPJOIN(EV)*/
EV.advertiser_id,
EV.pixel_id,
RDB.segment_id
FROM
tbl_a EV
JOIN tbl_b RDB
ON EV.mm_uuid = RDB.mm_uuid
WHERE
EV.days = 90 AND RDB.days = 90;
Nota: la sugerencia mapjoin
es necesaria también.
¿Alguien de la historia ha realizado con éxito una combinación de mapas con divisiones en Hive 13? Existe documentación limitada sobre BMJ ( http://www.openkb.info/2014/11/understanding-hive-joins-in-explain.html#.VVuZZpNViko y https://cwiki.apache.org/confluence/download/ archivos adjuntos / 27362054 / Hive% 2BSummit% 2B2011-join.pdf ). Parecen maravillosos, pero no puedo hacer que funcionen.
Si entiendo correctamente, debo comenzar mi comando con los siguientes parámetros:
SET hive.optimize.bucketmapjoin=true;
Esto hará que Hive convierta automáticamente mi antigua y lenta combinación de perezoso, súper lento y regular en una combinación ágil (esbelta e incluso?) De rápido acabado y en el mapa. Tal vez me faltan algunos parámetros aquí?
Mis tablas están ambas incluidas en el mismo código. Ambos están incluidos en 1024 cubos (¿podrían ser demasiados?). La mesa pequeña tiene un tamaño de cuchara de alrededor de 15 MB y la mesa grande tiene un tamaño de cuchara promedio de aproximadamente 10 GB.
Así es como se ve mi comando:
SET hive.optimize.bucketmapjoin=true;
SELECT
EV.advertiser_id,
EV.pixel_id,
RDB.segment_id
FROM
rakuten_segment_index2_bucketed_event_logs_ddp EV
JOIN rakuten_sir_bucketed_rdb RDB
ON EV.mm_uuid = RDB.mm_uuid
WHERE
EV.days = 90 AND RDB.days = 90;
Este comando da como resultado una unión lenta y constante del reductor. Funciona bien, pero muy lentamente.
Una cosa a tener en cuenta es que estas tablas están divididas. Solo estoy interesado en unirme a estas tablas donde el valor de la partición (días) = 90. ¿Podría el hecho de que estas tablas estén particionadas arruinar la unión de mapa con bucket?
También intenté establecer una sugerencia de unión de mapa explícitamente con /*+MAPJOIN(EV)*/
. Esto fuerza un mapjoin normal, no un mapjoin con bucket. Hive intenta cargar toda la tabla pequeña (er) en un hashmap y rápidamente se queda sin memoria.