以下は、常に日付で降順で並べ替えられた TestingTable1 のデータです。
BUYER_ID | ITEM_ID | CREATED_TIME
----------+-----------------+----------------------
1345653 110909316904 2012-07-09 21:29:06
1345653 151851771618 2012-07-09 19:57:33
1345653 221065796761 2012-07-09 19:31:48
1345653 400307563710 2012-07-09 18:57:33
そして、これが TestingTable2 の以下のデータであり、日付で常に降順で並べ替えられている場合
USER_ID | PRODUCT_ID | LAST_TIME
---------+----------------+-----------------------
1345653 110909316904 2012-07-09 22:29:06
1345653 150851771618 2012-07-09 19:57:33
の各行はTestingTable1
と一致する必要TestingTable2
があります。一致しない場合、またはデータが TestingTable2 にない場合は、TestingTable1
I have this data butに対応するTestingTable2
I have this data (これは間違ったデータになります)、何が不一致で、どのデータが欠落しているかを確認できます。
onとを比較する必要がTestingTable2
あります。とが一致する場合はとを比較する必要があり、それらのいずれかまたは両方でと比較した後に に不一致がある場合は、結果を表示する必要があります。TestingTable1
BUYER_ID
USER_ID
BUYER_ID
USER_ID
ITEM_ID
PRODUCT_ID
CREATED_TIME
LAST_TIME
TestingTable2
TestingTable1
上記の例を見ると、基本的に3つのシナリオがあります
- First- In
TestingTable1
、最初の行は の最初の行ITEM_ID
と一致しPRODUCT_ID
ますが、両方のテーブルの最初の行ではTestingTable2
一致CREATED_TIME
しませんLAST_TIME
- Secondly- In
TestingTable1
、2 番目の行の は の 2 番目の行の とCREATED_TIME
一致しますが、両方のテーブルの 2 番目の行のと一致しませんLAST_TIME
TestingTable2
ITEM_ID
PRODUCT_ID
- 3 番目に
TestingTable1
、最後の 2 行 (行) は にはまったくありませんTestingTable2
。このシナリオは、私が書いたクエリではカバーされていません。このシナリオもクエリに入れたいです。
これらは、alwaysと比較TestingTable2
しながらカバーする必要がある 3 つのケースです。TestingTable1
またTestingTable1
、常に比較を行う必要がある MAIN テーブルであるため、データTestingTable1
が常に正確であることを意味します。
したがって、上記の例のいずれにも一致しない場合、またはデータがまったく存在しない場合、次のような結果を表示する必要がありますTestingTable2
。TestingTable1
TestingTable2
TestingTable1
TestingTable2
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | LAST_TIME
-----------+-----------------+---------------------------+----------------+--------------------+-----------------------
1345653 110909316904 2012-07-09 21:29:06 1345653 110909316904 2012-07-09 22:29:06
1345653 151851771618 2012-07-09 19:57:33 1345653 150851771618 2012-07-09 19:57:33
1345653 221065796761 2012-07-09 19:31:48 NULL NULL NULL
1345653 400307563710 2012-07-09 18:57:33 NULL NULL NULL
以下は、私が上で述べたものだけをカバーする私が書いたクエリであり、two scenarios
正常に動作し、出力から最後の2行を残して上記のような出力を取得します。third scenario
ただし、上記のような出力が得られるように、この(下の)クエリにも 追加する必要があります。
SELECT *
FROM (SELECT T2.buyer_id,
T2.item_id,
T2.created_time AS created_time,
subq.user_id,
subq.product_id,
subq.LAST_TIME
FROM TestingTable2 subq
JOIN TestingTable1 T2
ON T2.buyer_id = subq.user_id
AND subq.LAST_TIME = ( T2.created_time )
WHERE ( subq.product_id <> T2.item_id )
UNION ALL
SELECT T2.buyer_id,
T2.item_id AS item_id,
T2.created_time,
subq.user_id,
subq.product_id AS product_id,
subq.LAST_TIME
FROM TestingTable2 subq
JOIN TestingTable1 T2
ON T2.buyer_id = subq.user_id
AND subq.product_id = T2.item_id
WHERE ( subq.LAST_TIME <> ( T2.created_time ) )) finalResult
ORDER BY finalResult.BUYER_ID;
任意の提案をいただければ幸いです。
PS 過去数日間、JOIN に関連するいくつかの質問をしましたが、それは私の 2 つのシナリオのみをカバーしており、このクエリで必要な 3 番目のシナリオはカバーしていません。
更新:-NOT IN
SQL のor構文を
使用できませんNOT EXISTS
。Hive を使用しており、Hive はNOT IN
orNOT EXISTS
をサポートしていないため、これに対処するには他の方法が必要です。
クエリを使用する必要があるのは、3 番目のシナリオで機能するようにクエリを変更することだけです。これにより、Hive が SQL 構文をサポートするようになります。
以下は私のSQL Fiddleです。これは、上記の 2 つのシナリオを満たしますが、3 番目のシナリオは満たしません。3番目のシナリオでも機能するようにクエリを変更するのを手伝ってくれる人はいますか?
http://sqlfiddle.com/#!3/102dd/1/0 .
Table1 のデータは Table2 に存在する必要があります。存在しない場合は、Table1 と比較した後にデータ間の不一致を示す必要があります。Table1 のデータが Table2 に存在しない可能性もあります。それも。
フィドルの更新された出力http://sqlfiddle.com/#!3/102dd/3/0
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | LAST_TIME
-----------+-----------------+---------------------------+----------------+--------------------+-----------------------
1345653 151851771618 July, 09 2012 19:57:33 1345653 150851771618 July, 09 2012 19:57:33
1345653 221065796761 July, 09 2012 19:31:48 1345653 221165796761 July, 09 2012 19:31:48
1345653 110909316904 July, 09 2012 21:29:06 1345653 110909316904 July, 09 2012 22:29:06
1345653 400307563710 July, 09 2012 18:57:33 NULL NULL NULL
1345653 310411560125 July, 09 2012 16:09:49 NULL NULL NULL
エラーが発生する更新された SQL クエリ
TestingTable1
このクエリに置き換えました-
(SELECT BUYER_ID, ITEM_ID, rank(BUYER_ID), CREATED_TIME
FROM (
SELECT BUYER_ID, ITEM_ID, CREATED_TIME
FROM testingtable1
where to_date(from_unixtime(cast(UNIX_TIMESTAMP(CREATED_TIME) as int))) = '2012-07-09'
DISTRIBUTE BY BUYER_ID
SORT BY BUYER_ID, CREATED_TIME desc
) T1
WHERE rank(BUYER_ID) < 5)
そしてTestingTable2
、このクエリで-
(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 where to_date(from_unixtime(cast(PROD_AND_TS.TIMESTAMPS as BIGINT))) = '2012-07-09')