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;

上記のクエリを使用すると、次の出力が得られます。

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

上記を比較するoutput from the query with the below Table2 dataと、 product_idinは以下のデータの最後の行last line of above outputのinと一致していません。ITEM_IDTable2

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

だから私の質問は

特定のBUYER_IDまたはUSER_IDに対応するデータと一致しないものPRODUCT_ID(ITEM_ID)をすべて検索します。TIMESTAMPS(CREATED_TIME)Table2

したがって、上記の例では、このような結果を表示する必要があります-

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

上記の結果を得るには、table2で記述した上記のクエリに参加する必要があります。したがって、JOININGプロセスで上記のクエリを使用する必要があります。それは私をとても混乱させます。任意の提案をいただければ幸いです。

アップデート:-

以下のクエリを書きましたが、どういうわけか私が達成したい出力を達成することができません。誰かがこれを手伝ってくれますか?

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));
4

2 に答える 2

2

2つのクエリでやりたいことができると思いますが、100%確実ではありません。多くの場合、この状況では、最初のテーブルで2番目のテーブルと一致しないものを見つけるだけで十分です。また、「最も近い」一致を取得しようとしているため、これは困難です。

次のクエリは、ユーザーIDと他の2つのフィールドの1つに一致するものを探し、それらを組み合わせます。

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)

これでは、どちらのフィールドにも一致するものがない状況は見つかりません。

また、これは「where」ではなく「on」構文を使用して記述しました。HIVEがこれをサポートしていると思います。

于 2012-07-11T13:52:58.523 に答える
1

担当者が高すぎるため、同じ質問の重複、特に2つの重複を開くことができません。

HiveQL(Hadoop)を使用してHiveで2つのテーブルを結合する

2つのテーブルを結合し、両方から出力を取得します

3番目のシナリオのレコードを結び付けるのに十分な情報がありません。
を使用してFULL OUTER JOINすべてORを元に戻し、リストした最初と2番目のケースのように十分な情報がある行を一致させ、一致しないフィールドのnullを含む行を返すことで一致しない行を特定できます。 3番目のシナリオのテーブル。

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)

3番目のシナリオで一致させようとするのはハックです-情報はありません

これにより、他の日に一致しない指定された日付のいずれかと一致しますが、ここでもデカルト積が得られます。

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

)

など を使用または試すことができます。RANK()これがHiveの質問でなければ、おそらくこれらのハックの中で最も優れていると思いますが、HQLを使用していることはわかっているので、これについては説明しません。それらを別のテーブルに引き出し、いくつかの論理更新クエリを実行して更新し、それをルックアップテーブルとして使用して結び付けることができます。top oneRANK()ROW_NO

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

おそらくあなたがすべきことは、あなたが賞金を提供した質問の人が提案したことです-あなたは本当に3番目のシナリオを照会する良い方法がなく、彼らはあなたにHIVEに固有の代替案を提供したからです。

于 2012-07-11T20:02:57.863 に答える