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 中的第二张表 - 它还包含有关我们正在购买的物品的信息。

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

问题陈述-

我需要比较Table2with Table1,这意味着我需要查看USER_IDfromTable2BUYER_IDfrom Table1(因为它们都是相同的东西)是否匹配,然后PURCHASED_ITEM在 Table2 中这是一个 PRODUCT_ID(与 ITEM_ID 相同)和 TIMESTAMPS(与 CREATED_TIME 相同)的数组应该ITEM_ID与特定CREATED_TIME的USER_ID(BUYER_ID)相同Table1,并且有时它们(表示PURCHASED_ITEMITEM_ID, )可能不同,或者在比较之后CREATED_TIME缺少某些 PRODUCT_ID 和 TIMESTAMPS 。Table2Table1

我的意思是,对于特定的 BUYER_ID(USER_ID),和 in 的计数PRODUCT_ID应该TIMESTAMPSTable2Table1 中的计数ITEM_ID和计数相同,CREATED_TIME并且内容应该相同。如果它们不一样或缺少条目Table2,那么我需要打印结果,这个特定的ITEM_IDCREATED_TIME缺少Table2或在比较之后PRODUCT_IDTIMESTAMPS不一样Table1

因此,例如,目前在 Table1 中,BUYER_ID 1015826235我有5 ITEM_ID5 CREATED_TIME,所以在 Table2 中,我应该在一行中5 PRODUCT_ID5 TIMESTAMPSTable1 完全相同。USER_ID(BUYER_ID)如果它不一样或条目丢失,那么我需要打印结果,显示这个丢失或者这个数据是错误的。

所以只是为了更清楚-

PURCHASED_ITEM是一个结构数组,Table2它包含两个东西PRODUCT_IDTIMESTAMPS

如果USER_IDandBUYER_ID得到匹配,则PRODUCT_IDinTable2应与ITEM_IDin匹配Table1TIMESTAMPSinTable2应与CREATED_TIMEin匹配Table1

更新

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 数据填充它(使用时间戳转换)。如果支持,这最终可能是一种观点。

然后可以使用以下查询来比较两个表的内容:

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 和时间戳使用“字符串”数据类型,因为它会使比较更加困难。而不是使用日期或时间戳。

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

我是 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() 函数会将空值转换为你的喜欢。

希望这可以帮助。

于 2012-07-15T07:11:57.387 回答