2012-07-01 23 views
10

Esta es la primera tabla en Colmena: contiene información sobre el artículo que estamos comprando.Consulta dos tablas relacionadas (Uniones)

CREATE EXTERNAL TABLE IF NOT EXISTS Table1 (This is the MAIN table through which comparisons need to be made) 
(
ITEM_ID BIGINT, 
CREATED_TIME STRING, 
BUYER_ID BIGINT 
) 

Y esto es los datos de la primera tabla anterior

**ITEM_ID** **CREATED_TIME** **BUYER_ID** 
220003038067  2012-06-21  1015826235 
300003861266  2012-06-21  1015826235 
140002997245  2012-06-14  1015826235 
200002448035  2012-06-08  1015826235 
260003553381  2012-06-07  1015826235 

Ésta es la segunda tabla en Hive- También contiene información sobre los artículos que están comprando.

CREATE EXTERNAL TABLE IF NOT EXISTS Table2 
(
USER_ID BIGINT, 
PURCHASED_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>> 
) 

Y esto es los datos de la mesa- anterior

**USER_ID** **PURCHASED_ITEM** 
1015826235  [{"product_id":220003038067,"timestamps":"1340321132000"}, {"product_id":300003861266,"timestamps":"1340271857000"}, {"product_id":140002997245,"timestamps":"1339694926000"}, {"product_id":200002448035,"timestamps":"1339172659000"}, {"product_id":260003553381,"timestamps":"1339072514000"}] 

He reducido los datos a una sola buyer_id (USER_ID) para hacer que el problema sencillo de entender.

Problema Sentencia-

necesito para comparar la Table2 con Table1, lo que significa que tengo que ver si USER_ID de Table2 y BUYER_ID de Table1 (ya que ambos son lo mismo) obtiene emparejado, a continuación, en PURCHASED_ITEM Table2 que es una matriz de PRODUCT_ID (igual que ITEM_ID) y TIMESTAMPS (igual que CREATED_TIME) debe ser igual a ITEM_ID y CREATED_TIME en Table1 para ese USER_ID en particular (BUYER_ID) y también a veces es posible que (means PURCHASED_ITEM y ITEM_ID, CREATED_TIME) no son iguales o algunos PRODUCT_ID y TIMESTAMPS falta en Table2 después de comparar desde Table1.

Con esto quiero decir el recuento de PRODUCT_ID y TIMESTAMPS en Table2 debe ser el mismo que el recuento de ITEM_ID y CREATED_TIME en la Tabla 1 para ese buyer_id en particular (USER_ID) y el contenido debe ser el mismo. Si ellos no son los mismos o de entrada no se encuentra en Table2, entonces necesito imprimir el resultado, este particular ITEM_ID y CREATED_TIME falta de Table2 o la PRODUCT_ID y TIMESTAMPS no son los mismos después de comparar entre Table1.

Así, por ejemplo, en la Tabla 1 actualmente para este BUYER_ID 1015826235 tengo 5 ITEM_ID y 5 CREATED_TIME, por lo que en la Tabla2 que debería tener 5 PRODUCT_ID y 5 TIMESTAMPS exactamente igual que la Tabla 1 para la misma USER_ID(BUYER_ID) en una fila. Si no es el mismo o falta la entrada, entonces necesito imprimir el resultado que muestra que falta o que esta información es incorrecta.

Así que para que sea más claro-

PURCHASED_ITEM es una matriz de Struct en Table2 y contiene dos cosas PRODUCT_ID y TIMESTAMPS.

Si USER_ID y BUYER_ID consigue coinciden, PRODUCT_ID en Table2 debe corresponder con ITEM_ID en Table1TIMESTAMPS y en Table2 debe complementarse con el CREATED_TIME en Table1.

ACTUALIZADO

Pregunta HiveQL de consultas SQL: -

Q 1) Find all USER_ID from Table2 whose PRODUCT_ID or TIMESTAMP are not same with 
ITEM_ID or CREATED_TIME after comparing with Table1 on BUYER_ID. 

de consulta que escribí para la primera pregunta. Es la consulta correcta?

A 1) select Table2.user_id from Table2 where Table1.user_id = Table2.buyer_id 
and (Table1.item_id <> Table2.product_id or UNIX_TIMESTAMP(Table1.created_time) <> 
Table2.timestamps) 


Q 2) Find the `BUYER_ID(USER_ID)` and as well as those `ITEM_ID` and `CREATED_TIME` 
which are missing from `Table2` after comparing from `Table1` on `BUYER_ID`. 

A 2) Not sure. 
+0

Todo ese texto en negrita fue un poco deslumbrante. – Ben

Respuesta

0

no estoy familiarizado con la colmena, pero me gustaría sugerir que se crea una tabla temporal con el mismo esquema que la Tabla 1, y llenarlo con los datos Tabla2 (con la conversión de fecha y hora). Eventualmente podría ser una vista, si es compatible.

Al comparar el contenido de dos tablas a continuación, es posible con consultas tales como:

SELECT * FROM Table1 WHERE (ITEM_ID,CREATED_TIME,BUYER_ID) NOT IN (SELECT * FROM Table2bis) 

SELECT * FROM Table2bis WHERE (ITEM_ID,CREATED_TIME,BUYER_ID) NOT IN (SELECT * FROM Table1) 
+0

Gracias por comentar. Pero esto no funcionará con HiveQL, supongo. :( – AKIWEB

1

sugiero que no utilice el tipo de datos "cadena" para su CREATED_TIME y marca de tiempo, ya que hace que las comparaciones más difícilmente. En lugar de eso use Date o TimeStamp.

Y para su pregunta: ¡Creo que el gran problema aquí es usar solo cuerdas!

soy usuario de Oracle, pero no debería ser algo como esto en la colmena:

To_date({string},{Format}) 

como antes

UNIX_TIMESTAMP({string}) 

Otra cosa: cuando se tiene strucs, que shouls abordar campos como éste : Table2.PURCHASED_ITEM [{address}]. Product_id y no Table2.product_id que se desconoce.

y uno más sugerencia:

Trunc({Date},{Format ex: 'SS' for sseconds}) 

cuando su CREATED_TIME y su indicación_hora no son exactamente en las garrapatas al mismo tiempo (puede ser 0.001 segundos diferencia debido al tiempo de inserción diferencia si se inserta ahora o SysDate para cada uno de ellos) es mejor truncar la fecha a segundos o Milli-segundos o lo que sea que piense que es mejor.

Una cosa más: use NVL() o aquí también valores nulos, porque si tiene tales problemas también es posible tener valores nulos en su tabla que causan problemas en sus consultas, la función NVL() convertirá nulo a algo que te gusta.

Espero que esto ayude.

Cuestiones relacionadas