这是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),以使问题易于理解。
问题陈述 -
我需要将Table2
与Table1
进行比较,这意味着我需要查看来自USER_ID
的{{1}}和来自Table2
的{{1}} (因为它们都是一样的)得到匹配,然后Table2中的BUYER_ID
是一个PRODUCT_ID数组(与ITEM_ID相同),TIMESTAMPS(与CREATED_TIME相同)应该与Table1
和{{1在PURCHASED_ITEM
中针对该特定的USER_ID(BUYER_ID),有时它们(意味着ITEM_ID
和CREATED_TIME
,Table1
)可能不相同或某些PRODUCT_ID和从PURCHASED_ITEM
进行比较后,ITEM_ID
缺少TIMESTAMPS。
我的意思是CREATED_TIME
中的Table2
和Table1
的计数应该与表1中PRODUCT_ID
和TIMESTAMPS
的计数相同,因为该特定的BUYER_ID (USER_ID)和内容应该相同。如果它们不相同或Table2
缺少参赛作品,那么我需要打印结果,ITEM_ID
或{{1}缺少此特定CREATED_TIME
和Table2
从ITEM_ID
进行比较后,{}和CREATED_TIME
不一样。
例如,在目前这个Table2
的表1中,我有PRODUCT_ID
和TIMESTAMPS
,所以在表2中我应该Table1
和BUYER_ID 1015826235
完全相同Table1表示同一行中的5 ITEM_ID
。如果它不相同或缺少条目,那么我需要打印显示缺少的结果或此数据是错误的。
所以只是为了让它更清晰 -
5 CREATED_TIME
是5 PRODUCT_ID
中的一个Struct数组,它包含两个5 TIMESTAMPS
和USER_ID(BUYER_ID)
的内容。
如果匹配PURCHASED_ITEM
和Table2
,则PRODUCT_ID
中的TIMESTAMPS
应与USER_ID
和BUYER_ID
中的PRODUCT_ID
匹配Table2
中的ITEM_ID
应与Table1
中的TIMESTAMPS
匹配。
已更新
HiveQL SQL查询问题: -
Table2
查询我为第一个问题写的。查询是对的吗?
CREATED_TIME
答案 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你喜欢的东西。
希望这有帮助。