如何在没有重复的情况下在 hive 中执行 LEFT OUTER JOIN 以仅检查右表中的一个值?

Posted

技术标签:

【中文标题】如何在没有重复的情况下在 hive 中执行 LEFT OUTER JOIN 以仅检查右表中的一个值?【英文标题】:How to perform LEFT OUTER JOIN in hive without duplicates to check only one value in the right table? 【发布时间】:2017-08-09 20:19:45 【问题描述】:

我有两个数据集: 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

我想在 hive 中执行左外连接(表 A 左外连接表 B),这样在连接列“id”上的两个数据集时,如果表 B 中的状态列在至少一次,则生成的数据集的状态将为“是”,如下所示:

Final Result:       
id  name    Status
1   raju    Yes
2   ramu    Yes
2   ramu    Yes
3   rakesh  No

我不想在执行联接时增加结果中的记录数。结果表应该只有4条记录,而不是5条(增加 基于匹配连接条件的记录)。

我如何做到这一点?

【问题讨论】:

【参考方案1】:

为满足此要求,您需要将表 B 的行数减少到表 A 的每行一行或零行。

这样做,为每个id 值获取一行,状态为Y

         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

【讨论】:

不需要在子查询中检索status。该案例可以在id上完成

以上是关于如何在没有重复的情况下在 hive 中执行 LEFT OUTER JOIN 以仅检查右表中的一个值?的主要内容,如果未能解决你的问题,请参考以下文章

在没有堆栈溢出的情况下在 javascript 中执行无限动画的模式

如何在没有 Flash 的情况下在 Firefox 中实现复制到剪贴板。需要实施[重复]

如何在没有jQuery的情况下在javascript中执行php文件

如何在不使用 &nbsp 的情况下在行内元素之间添加空格 [重复]

在没有 JS 库的情况下在 <canvas> 上为 spritesheet 设置动画 [重复]

如何在没有 ID 的情况下在 Prisma 中插入新记录?