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の2番目のテーブルです-これには、購入しているアイテムに関する情報も含まれています。

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

そしてこれは上の表のデータです-

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

問題を理解しやすくするために、データを1つのBUYER_ID(USER_ID)のみに減らしました。

問題文-

Table2withを比較するTable1必要があります。つまり、USER_IDfromTable2BUYER_IDfrom Table1(両方とも同じものであるため)が一致するかどうかを確認する必要があります。次にPURCHASED_ITEM、PRODUCT_ID(ITEM_IDと同じ)とTIMESTAMPS(CREATED_TIMEと同じ)の配列であるTable2でその特定のUSER_ID(BUYER_ID)と同じでITEM_IDありCREATED_TIME、また、それら(meansと、 )が同じでないか、から比較した後に一部のPRODUCT_IDとTIMESTAMPSが欠落している可能性もあります。Table1PURCHASED_ITEMITEM_IDCREATED_TIMETable2Table1

これは、その特定のBUYER_ID(USER_ID)のとの数が表1のとの数と同じであり、内容が同じである必要があるPRODUCT_IDことTIMESTAMPSを意味します。それらが同じでないか、エントリがから欠落している場合は、結果を出力する必要があります。この特定のandは、またはから欠落しており、から比較した後、同じではありません。Table2ITEM_IDCREATED_TIMETable2ITEM_IDCREATED_TIMETable2PRODUCT_IDTIMESTAMPSTable1

たとえば、現在、これについてはTable1にとBUYER_ID 10158262355 ITEM_IDあり5 CREATED_TIMEます。したがって、Table2には、1つの行に同じものがある場合はTable15 PRODUCT_ID5 TIMESTAMPSまったく同じである必要があります。USER_ID(BUYER_ID)それが同じでないか、エントリが欠落している場合は、これが欠落しているか、このデータが間違っていることを示す結果を印刷する必要があります。

それで、それをより明確にするために-

PURCHASED_ITEMはStructの配列であり、Table22つのものPRODUCT_IDとが含まれていますTIMESTAMPS

USER_IDBUYER_IDが一致する場合、 PRODUCT_IDinはinとTable2一致する必要があり、 inはITEM_IDinTable1と一致する必要があります。TIMESTAMPSTable2CREATED_TIMETable1

更新しました

HiveQL 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.

最初の質問のために書いたクエリ。クエリは正しいですか?

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.
4

2 に答える 2

1

私は Hive に詳しくありませんが、Table1 と同じスキーマで一時テーブルを作成し、Table2 データ (タイムスタンプ変換あり) を入力することをお勧めします。サポートされている場合、これは最終的にビューになる可能性があります。

次のようなクエリを使用して、2 つのテーブルの内容を比較できます。

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)
于 2012-07-07T12:39:58.367 に答える
1

比較が難しくなるため、CREATED_TIME とタイムスタンプに「文字列」データ型を使用しないことをお勧めします。その代わりに、Date または TimeStamp を使用してください。

そして、あなたの質問に対して: ここでの大きな問題は、文字列を単独で使用することだと思います!

私はOracleユーザーですが、Hiveには次のようなものがあるはずです:

To_date({string},{Format})

あなたが使用したように

UNIX_TIMESTAMP({string})

別のこと: 構造体がある場合、次のようなアドレス フィールドを使用する必要があります。

もう1つの提案:

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

CREATED_TIME と time_stamp が正確に同じタイム ティックではない場合 (それぞれに Now または Sysdate を挿入すると、挿入時間が異なるため 0.001 秒の差になる可能性があります)、日付を秒またはミリ秒などに切り捨てた方がよいでしょう。良いと思います。

もう 1 つ: ここでも NVL() または Convert null 値を使用します。このような問題がある場合、クエリで問題を引き起こすテーブルに null 値が含まれている可能性があるため、NVL() 関数は null を何かに変換します。お気に入り。

お役に立てれば。

于 2012-07-15T07:11:57.387 に答える