SQL Query JOIN with Table

时间:2012-07-08 20:19:19

标签: sql join hive

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_id中的last line of above output与下面ITEM_ID中最后一行中的Table2不匹配数据

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

2 个答案:

答案 0 :(得分:2)

我认为你可以通过两个查询做你想做的事,但我不是百分百肯定的。通常在这种情况下,在第一个表中找到第二个表中不匹配的内容就足够了。你也试图获得“最接近”的比赛,这就是为什么这很有挑战性。

以下查询查找用户ID上的匹配项以及其他两个字段中的一个,然后将它们组合在一起:

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)

这不会找到任何一个字段都不匹配的情况。

另外,我使用“on”语法而不是“where”编写了这个。我认为HIVE支持这一点。

答案 1 :(得分:1)

您的代表太高,无法打开重复的,特别是同一问题的2个副本。

Joining two Tables in Hive using HiveQL(Hadoop)

Join Two Tables and get the output from both of them

您没有足够的信息将记录与第三种情况联系起来 您可以使用FULL OUTER JOIN执行OR并获取所有内容,将您拥有足够信息的行与列出的第一个和第二个案例相匹配,并通过返回来识别您没有的内容第三个场景中非匹配表的字段为空的行。

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)

尝试匹配第三种情况是黑客 - 信息不存在

这将与指定的日期中的任何日期匹配,但在其他日子不匹配,但您将再次获得笛卡尔积。

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()或尝试使用top one,等等RANK()ROW_NO可能是这些黑客中最好的,如果这不是Hive问题,因为我知道你正在使用HQL,我不会写它。您可以在单独的表中将它们拉出来并运行一些逻辑更新查询来更新它,然后将其用作查找表以进行绑定。

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

你应该做的是你提出的问题中的人提出的建议 - 因为你真的没有一个好的方法来查询第三个场景,他们为你提供了一个特定于HIVE的替代方案。 / p>