2012-07-01 6 views
10

Это первая таблица в Hive- содержит информацию о предмете, который мы покупаем.Запросить две связанные таблицы (Соединения)

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 
) 

И это данные в приведенной выше первой таблице

**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 

Это вторая таблица в Hive- Он также содержит информацию о деталях, то мы приобретающих.

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

И это данные в приведенной выше table-

**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"}] 

Я уменьшил данные только один BUYER_ID (USER_ID), чтобы сделать эту проблему просто понять.

Проблема Оператор-

Мне нужно сравнить Table2 с Table1, что означает, что я должен видеть, если USER_ID от Table2 и BUYER_ID от Table1 (так как они оба то же самое) получает соответствующее значение, то PURCHASED_ITEM в Таблица 2, которая представляет собой массив PRODUCT_ID (то же, что и ITEM_ID) и TIMESTAMPS (то же, что и CREATED_TIME), должна быть такой же, как ITEM_ID и CREATED_TIME в Table1 для этого конкретного USER_ID (BUYER_ID), а также иногда бывает, что они (средства PURCHASED_ITEM и ITEM_ID, CREATED_TIME) не совпадают или некоторые PRODUCT_ID и TIMESTAMPS отсутствуют с Table2 после сравнения с Table1.

Под этим я имею в виду подсчет PRODUCT_ID и TIMESTAMPS в Table2 должно быть таким же, как подсчет ITEM_ID и CREATED_TIME в табл.1 для этого конкретного BUYER_ID (USER_ID) и содержание должно быть таким же. Если они не являются одинаковыми или запись отсутствует Table2, то мне нужно распечатать результат, данный ITEM_ID и CREATED_TIME отсутствует Table2 или PRODUCT_ID и TIMESTAMPS не то же самое после того, как по сравнению с Table1.

Так, например, в Table1 в настоящее время для этого BUYER_ID 1015826235 я имею 5 ITEM_ID и 5 CREATED_TIME, поэтому в Table2 я должен 5 PRODUCT_ID и 5 TIMESTAMPS точно так же, как Table1 для одной USER_ID(BUYER_ID) в одном ряду. Если это не то же самое или запись отсутствует, мне нужно распечатать результат, показывая, что это отсутствует или эти данные неверны.

Так просто, чтобы сделать его более, очищающего

PURCHASED_ITEM является массив структур в Table2 и содержит две вещи PRODUCT_ID и TIMESTAMPS.

Если USER_ID и BUYER_ID получает соответствие затем PRODUCT_ID в Table2 должен быть согласован с ITEM_ID в Table1 и TIMESTAMPS в Table2 должны быть согласованы с CREATED_TIME в Table1.

ОБНОВЛЕНО

HiveQL SQL Query Вопрос: -

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. 

запросов, которые я написал для первого вопроса. Правильно ли это запрос?

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

Весь этот полужирный текст был немного ослепляющим. – Ben

ответ

0

Я не знаком с ульем, но я хотел бы предложить вам создать временную таблицу с той же схемой, как Table1, и заполнить его данными TABLE2 (с преобразованием временных меток). В конечном итоге это может быть точкой зрения, если поддерживается.

Сравнивая содержание двух таблиц, то можно с запросами, такие как:

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

Спасибо за комментарии. Но это не сработает с HiveQL. :( – AKIWEB

1

Я предлагаю вам не использовать «строку» типа данных для вашего CREATED_TIME и меток времени, потому что это делает сравнение Harder. Вместо этого используйте Date или TimeStamp.

И на ваш вопрос: Я думаю, что большая проблема здесь заключается в использовании строк в одиночку!

Я пользователь оракула, но там должно быть что-то вроде этого в улье:

To_date({string},{Format}) 

, как вы использовали

UNIX_TIMESTAMP({string}) 

Другое дело: когда у вас есть strucs, вы shouls адрес поля, как это : Table2.PURCHASED_ITEM [{address}]. Product_id, а не Table2.product_id, который неизвестен.

и еще одно предложение:

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

когда ваш CREATED_TIME и ваш time_stamp не точно в то же время тикает (может быть 0,001 секунды разница из-за разницы во времени вставки при вставке Теперь или Sysdate для каждого из их), вы лучше усекаете дату в секундах или миллисекундах или что бы вы ни думали лучше.

Еще одна вещь: использовать NVL() или преобразовать нулевые значения здесь, потому что если у вас есть такие проблемы, возможно также иметь нулевые значения в вашей таблице, что вызывает проблемы в ваших запросах, функция NVL() преобразует null к чему-то, что вам нравится.

Надеюсь, это поможет.