2012-07-08 20 views
5
select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as 
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table 
as prod_and_ts; 

Al usar la consulta anterior, obtengo el resultado siguiente.Consulta SQL JOIN con la Tabla

USER_ID  | PRODUCT_ID | TIMESTAMPS 
------------+------------------+------------- 
1015826235  220003038067  1004841621 
1015826235  300003861266  1005268799 
1015826235  140002997245  1061569397 
1015826235  *200002448035*  1005542471 

Si se compara lo anterior output from the query with the below Table2 data, entonces el product_id en el last line of above output no coincide con el ITEM_ID en la última línea en los siguientes Table2 datos.

BUYER_ID  | ITEM_ID  |  CREATED_TIME 
-------------+-------------------+------------------------ 
1015826235  220003038067  2001-11-03 19:40:21 
1015826235  300003861266  2001-11-08 18:19:59 
1015826235  140002997245  2003-08-22 09:23:17 
1015826235  *210002448035*  2001-11-11 22:21:11 

Así que mi pregunta es

Encontrar todos los PRODUCT_ID(ITEM_ID)TIMESTAMPS(CREATED_TIME) y que no son coincidentes con los datos correspondientes a Table2 particular, buyer_id o USER_ID.

por eso es necesario para mostrar el resultado como este para el ejemplo- por encima de

BUYER_ID |  ITEM_ID  |  CREATED_TIME  |  USER_ID |  PRODUCT_ID  | TIMESTAMPS 
-----------+-------------------+-------------------------+---------------+------------------+------------------ 
1015826235  *210002448035*  2001-11-11 22:21:11  1015826235  *200002448035*  1005542471 

necesito para unirse a la consulta anterior que escribí con tabla2 para obtener el resultado anterior. Entonces necesito usar mi consulta anterior en el proceso de JOINING. Eso me está confundiendo mucho. Cualquier sugerencia será apreciada.

ACTUALIZACIÓN: -

me escribió la siguiente consulta, pero de alguna manera yo no soy capaz de lograr el resultado que quería lograr. Puede alguien ayudarme con esto?

SELECT table2.buyer_id, table2.item_id, table2.created_time from 
(select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as 
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table 
as prod_and_ts) prod_and_ts JOIN table2 where 
prod_and_ts.user_id = table2.buyer_id 
and (product_id <> table2.item_id or 
timestamps <> UNIX_TIMESTAMP(table2.created_time)); 
+1

Estoy trabajando con Hive, y Hive admite la sintaxis de SQL, por lo que esta es la razón por la que etiqueto esta pregunta como 'sql' y' join'. Entonces JOIN funcionará en HIVE. Solo necesito UNIRME básicamente. Entonces creo que la sintaxis de Oracle estará bien. – ferhan

+0

¿Por qué la última línea no coincide? ¿Es porque la marca de tiempo no coincide con el tiempo creado? – dash

+0

No estoy seguro de si la consulta real que escribí es correcta o no. Eso me está confundiendo mucho. Por lo tanto, no estoy seguro de si la consulta anterior es correcta o no. – ferhan

Respuesta

2

Creo que puede hacer lo que quiera con dos consultas, pero no estoy 100% seguro. A menudo, en esta situación, es suficiente encontrar cosas en la primera tabla que no coinciden en la segunda tabla. También estás tratando de obtener un partido "más cercano", por lo que es un desafío.

La siguiente consulta busca coincidencias en ID de usuario y exactamente uno de los otros dos campos, y luego las combina:

SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* 
from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps 
     from testingtable2 LATERAL VIEW 
      explode(purchased_item) exploded_table as prod_and_ts 
    ) prod_and_ts JOIN 
    table2 
    on prod_and_ts.user_id = table2.buyer_id and 
     prod_and_ts.product_id = table2.item_id and 
     prod_and_ts.timestamps <> UNIX_TIMESTAMP(table2.created_time) 
union all 
SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* 
from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps 
     from testingtable2 LATERAL VIEW 
      explode(purchased_item) exploded_table as prod_and_ts 
    ) prod_and_ts JOIN 
    table2 
    on prod_and_ts.user_id = table2.buyer_id and 
     prod_and_ts.product_id <> table2.item_id and 
     prod_and_ts.timestamps = UNIX_TIMESTAMP(table2.created_time) 

Esto no va a encontrar situaciones en las que no hay ninguna coincidencia en cualquiera de los campos.

Además, he escrito esto usando la sintaxis "on" en lugar de "where". Supongo que HIVE apoya esto.

1

Su representante es demasiado alto para abrir un duplicado y especialmente 2 duplicados de la misma pregunta.

Joining two Tables in Hive using HiveQL(Hadoop)

Join Two Tables and get the output from both of them

Usted no tienen suficiente información para atar los registros de vuelta para el tercer escenario.
Puede hacer un FULL OUTER JOIN con un OR y recuperar todo, hacer coincidir las filas en las que tiene suficiente información como en el primer y segundo caso que enumera, e identificar recs que no devuelve filas con nulos para los campos de la tabla que no coincide en el tercer escenario.

SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* 
FROM SO_Table1HIVE A 
FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] 
AND (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) 

tratando de igualar en el tercer escenario es un truco - la información no está allí

Esto coincidirá con cualquier fecha especificada para la que no se pongan en venta en los otros días, pero Nuevamente obtendrá productos cartesianos.

SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* 
FROM SO_Table1HIVE A 
FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] 
AND (
    (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) 
    OR 
    (
     (A.Created_TIME <> B.t1time AND B.PRODUCTID <> A.ITEM_ID AND DATEPART(d,B.T1time) = DATEPART(d,A.Created_TIME)) 
     AND a.ITEM_ID NOT IN(SELECT ITEM_ID 
        FROM SO_Table1HIVE A2 
        INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) 
        ) 

     AND B.PRODUCTID NOT IN(SELECT PRODUCTID 
        FROM SO_Table1HIVE A2 
        INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) 
        ) 
    ) 

) 

Usted podría utilizar RANK() o probar un top one, etc. RANK() o ROW_NO sería probablemente el mejor de estos hacks si esto no fuera una pregunta de la colmena, pero que yo sepa que está utilizando HQL, no voy para escribirlo. Podrías sacarlos en una tabla separada y ejecutar algunas consultas de actualización lógica para actualizarlo, luego usar eso como una tabla de búsqueda para vincular.

tbl1Tbl2Lookup 
--------------- 
id int identity 
table1info FK 
table2info FK 

Lo que probablemente debería hacer es lo que la persona en la pregunta que se ofreció una recompensa sobre sugerido - ya que realmente no tiene una buena forma de consultar el tercer escenario y que le ofrecerá una alternativa que es específica a HIVE.

Cuestiones relacionadas