查询两个相关表(连接)

时间:2012-07-01 21:33:13

标签: java sql hadoop hive hiveql

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

这是上表中的数据 -

**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),以使问题易于理解。

问题陈述 -

我需要将Table2Table1进行比较,这意味着我需要查看来自USER_ID的{​​{1}}和来自Table2的{​​{1}} (因为它们都是一样的)得到匹配,然后Table2中的BUYER_ID是一个PRODUCT_ID数组(与ITEM_ID相同),TIMESTAMPS(与CREATED_TIME相同)应该与Table1和{{1在PURCHASED_ITEM中针对该特定的USER_ID(BUYER_ID),有时它们(意味着ITEM_IDCREATED_TIMETable1)可能不相同或某些PRODUCT_ID和从PURCHASED_ITEM进行比较后,ITEM_ID缺少TIMESTAMPS。

我的意思是CREATED_TIME中的Table2Table1的计数应该与表1中PRODUCT_IDTIMESTAMPS的计数相同,因为该特定的BUYER_ID (USER_ID)和内容应该相同。如果它们不相同或Table2缺少参赛作品,那么我需要打印结果,ITEM_ID或{{1}缺少此特定CREATED_TIMETable2ITEM_ID进行比较后,{}和CREATED_TIME不一样。

例如,在目前这个Table2的表1中,我有PRODUCT_IDTIMESTAMPS,所以在表2中我应该Table1BUYER_ID 1015826235完全相同Table1表示同一行中的5 ITEM_ID。如果它不相同或缺少条目,那么我需要打印显示缺少的结果或此数据是错误的。

所以只是为了让它更清晰 -

5 CREATED_TIME5 PRODUCT_ID中的一个Struct数组,它包含两个5 TIMESTAMPSUSER_ID(BUYER_ID)的内容。

如果匹配PURCHASED_ITEMTable2,则PRODUCT_ID中的TIMESTAMPS应与USER_IDBUYER_ID中的PRODUCT_ID匹配Table2中的ITEM_ID应与Table1中的TIMESTAMPS匹配。

已更新

HiveQL SQL查询问题: -

Table2

查询我为第一个问题写的。查询是对的吗?

CREATED_TIME

2 个答案:

答案 0 :(得分:1)

我不熟悉Hive,但我建议你创建一个与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)

答案 1 :(得分:1)

我建议您不要为CREATED_TIME和时间戳使用“字符串”数据类型,因为它会使比较更难。而不是使用Date或TimeStamp。

对于你的问题:我认为这里的大问题是单独使用字符串!

我是oracle用户,但在Hive中应该有这样的东西:

To_date({string},{Format})

使用

UNIX_TIMESTAMP({string})

另一件事:当你有结构时,你会像这样调整地址字段:Table2.PURCHASED_ITEM [{address}]。product_id而不是Table2.product_id,这是未知的。

还有一个建议:

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

当你的CREATED_TIME和你的time_stamp不完全在同一时间滴答时(由于插入时间差异为0.001秒,如果你为每一个插入Now或Sysdate,你可以更好地截断日期为秒或毫秒)或者你认为更好的东西。

还有一件事:在这里使用NVL()或转换空值,因为如果你有这样的问题,你的表中也可能有空值,这会导致你的查询出现问题,NVL()函数会转换为null你喜欢的东西。

希望这有帮助。