es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JOIN de HIVE/PIG basado en la coincidencia de SUBSTRING.

Tengo un requisito en el cual necesito unir una tabla de tweets con nombres de personas, filtrando los tweets que contengan algún nombre de persona. Tengo los siguientes datos:

Tabla de Tweets: (70 millones de registros almacenados como una tabla HIVE)

id tweet
1 Cristiano Ronaldo el mejor de todos los tiempos
2 Películas de Brad Pitt
3 Un tweet al azar sin ningún nombre de persona

Nombres de Personas: (1,6 millones de nombres almacenados en HDFS como un archivo .tsv)

id person_name
1 Cristiano Ronaldo
2 Brad Pitt
3 Angelina Jolie

Resultado Esperado:

id tweet person_name
1 Cristiano Ronaldo el mejor de todos los tiempos Cristiano Ronaldo
2 Películas de Brad Pitt Brad Pitt

Lo que he intentado hasta ahora:

He convertido el archivo .tsv de nombres de personas en una tabla HIVE y he tratado de unir ambas tablas con la siguiente consulta de HIVE:

SELECT * FROM tweets t INNER JOIN people p WHERE instr(t.tweet, p.person_name) > 0;

Lo probé con algunos datos de muestra y funcionó bien. Pero cuando intenté ejecutarlo con todos los datos (70 millones de tweets unidos con 1,6 millones de nombres de personas), tardó una eternidad. Definitivamente no parece muy eficiente.

También quise probar a unirlo con PIG (ya que se considera un poco más eficiente que la unión de HIVE), donde puedo unir directamente el archivo .tsv de nombres de personas con la tabla de tweets de HIVE, pero no estoy seguro de cómo unirlo en función de una subcadena en PIG.

¿Alguien puede compartir la sintaxis de la unión de PIG para este problema si tiene alguna idea? Además, ¿puede sugerirme alguna alternativa que pueda usar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Se puede utilizar la declaración FILTER de PIG para unir las dos tablas basadas en una subcadena. La sintaxis sería algo como esto:


    A = LOAD 'people.tsv' USING PigStorage('\t') AS (id:int, person_name:chararray);
    B = LOAD 'tweets.hive' USING HiveLoader();
    C = FILTER B BY INSTR(tweet, person_name) > 0;
    D = JOIN A BY person_name, C BY tweet;
    STORE D INTO 'result.tsv' USING PigStorage('\t');

    Alternativamente, también se puede utilizar la función REGEX_EXTRACT para extraer los nombres de las personas de los tweets y luego unir las dos tablas. La sintaxis sería algo como esto:


    A = LOAD 'people.tsv' USING PigStorage('\t') AS (id:int, person_name:chararray);
    B = LOAD 'tweets.hive' USING HiveLoader();
    C = FOREACH B GENERATE id, REGEX_EXTRACT(tweet, '(\w+)', 1) AS person_name;
    D = JOIN A BY person_name, C BY person_name;
    STORE D INTO 'result.tsv' USING PigStorage('\t');

Comments are closed.