查询两个相关表(连接)

AKI*_*WEB 10 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
)
Run Code Online (Sandbox Code Playgroud)

这是上面第一个表格中的数据

**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
Run Code Online (Sandbox Code Playgroud)

这是Hive中的第二个表 - 它还包含有关我们正在购买的项目的信息.

CREATE EXTERNAL TABLE IF NOT EXISTS Table2
(
USER_ID BIGINT,
PURCHASED_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>>
)
Run Code Online (Sandbox Code Playgroud)

这是上表中的数据 -

**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"}]
Run Code Online (Sandbox Code Playgroud)

我已将数据减少到只有一个BUYER_ID(USER_ID),以使问题易于理解.

问题陈述-

我需要比较Table2Table1,这意味着我要看看是否USER_IDTable2BUYER_IDTable1(因为他们都是同样的事情)获取匹配,然后PURCHASED_ITEM在表2是PRODUCT_ID数组(同ITEM_ID)和时间戳(同CREATED_TIME)应是相同ITEM_IDCREATED_TIMETable1该特定USER_ID(BUYER_ID)和有时也有可能的是它们(装置PURCHASED_ITEMITEM_ID,CREATED_TIME)不相同或一些PRODUCT_ID和时间戳是从缺失Table2从比较之后Table1.

我的意思是,对于特定的BUYER_ID(USER_ID),count PRODUCT_IDTIMESTAMPSin 的计数Table2应该与table1的count ITEM_ID和count相同,CREATED_TIME并且内容应该相同.如果它们不相同或条目从丢失Table2,然后我需要打印结果,这种特殊ITEM_IDCREATED_TIME从丢失Table2PRODUCT_IDTIMESTAMPS来自比较后不相同Table1.

因此,例如在表1当前为此BUYER_ID 1015826235我有5 ITEM_ID5 CREATED_TIME,因此在表2我应该5 PRODUCT_ID5 TIMESTAMPS完全相同的表1的相同USER_ID(BUYER_ID)一行.如果它不相同或缺少条目,那么我需要打印结果显示缺少该数据或此数据是错误的.

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

PURCHASED_ITEM是在结构的阵列Table2,它包含两件事情PRODUCT_IDTIMESTAMPS.

如果USER_IDBUYER_ID被匹配,然后PRODUCT_IDTable2应该匹配ITEM_IDTable1,并TIMESTAMPSTable2应匹配CREATED_TIMETable1.

更新

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.
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

小智 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)
Run Code Online (Sandbox Code Playgroud)