如何在hive中不重复执行LEFT OUTER JOIN只检查右侧table中的一个值?
How to perform LEFT OUTER JOIN in hive without duplicates to check only one value in the right table?
我有两个数据集:
1)
Table A
id name
1 raju
2 ramu
2 ramu
3 rakesh
Table A
2)
Table B
id Status
1 Y
1 Y
2 N
2 N
2 Y
3 N
Table B
我想在配置单元中执行左外连接(Table A 左外连接 Table B),这样在连接列 'id' 上的两个数据集时,如果 table B 中的 Status 列至少有一次 'Y',则结果数据集的 Status 为 'Yes',如下所示:
Final Result:
id name Status
1 raju Yes
2 ramu Yes
2 ramu Yes
3 rakesh No
我不想在执行联接时增加结果中的记录数。结果 table 应该只有 4 条记录,而不是 5(增加
根据匹配的连接条件记录)。
如何实现?
为满足此要求,您需要将 table B 的行数减少到每行 table A 的一行或零行。
这样做,为状态为 Y
.
的每个 id
值获取一行
SELECT DISTINCT id, Status
FROM B
WHERE Status = 'Y'
然后您可以使用旧的 LEFT JOIN ... IS NOT NULL
技巧来找出 A 的哪些行与 B 的匹配行。
这样就可以了。 (http://sqlfiddle.com/#!9/71d84b/1/0)
SELECT A.id, A.name,
CASE WHEN B.Status IS NOT NULL THEN 'Yes' ELSE 'No' END Status
FROM A
LEFT JOIN (
SELECT DISTINCT id, Status
FROM B
WHERE Status = 'Y'
) B ON A.id = B.id
我有两个数据集: 1)
Table A
id name
1 raju
2 ramu
2 ramu
3 rakesh
Table A
2)
Table B
id Status
1 Y
1 Y
2 N
2 N
2 Y
3 N
Table B
我想在配置单元中执行左外连接(Table A 左外连接 Table B),这样在连接列 'id' 上的两个数据集时,如果 table B 中的 Status 列至少有一次 'Y',则结果数据集的 Status 为 'Yes',如下所示:
Final Result:
id name Status
1 raju Yes
2 ramu Yes
2 ramu Yes
3 rakesh No
我不想在执行联接时增加结果中的记录数。结果 table 应该只有 4 条记录,而不是 5(增加 根据匹配的连接条件记录)。
如何实现?
为满足此要求,您需要将 table B 的行数减少到每行 table A 的一行或零行。
这样做,为状态为 Y
.
id
值获取一行
SELECT DISTINCT id, Status
FROM B
WHERE Status = 'Y'
然后您可以使用旧的 LEFT JOIN ... IS NOT NULL
技巧来找出 A 的哪些行与 B 的匹配行。
这样就可以了。 (http://sqlfiddle.com/#!9/71d84b/1/0)
SELECT A.id, A.name,
CASE WHEN B.Status IS NOT NULL THEN 'Yes' ELSE 'No' END Status
FROM A
LEFT JOIN (
SELECT DISTINCT id, Status
FROM B
WHERE Status = 'Y'
) B ON A.id = B.id