在Hive中使用LIKE或RLIKE连接表

时间:2016-09-21 11:48:35

标签: hadoop join hive rlike

我试图(INNER)使用RLIKE在Hive中连接两个表。

select a.col_x, b.col_y, count(*) as n
from tableA a
join tableB b
ON a.col_x RLIKE concat('^', b.col_z)
group by a.col_x, b.col_y

(tableA apprx.100M记录,tableB apprx.1k记录)

此查询无法正常工作,因为Hive仅支持等号连接。

我将不等式移到where子句(参考:Error in Hive Query while joining tables)。

select a.col_x, b.col_y, count(*) as n
from tableA a , tableB b
WHERE a.col_x RLIKE concat('^', b.col_z)
group by a.col_x, b.col_y

第二种方法不会返回任何错误。但是,它运行得非常慢。运行大约1小时但仍无法获得输出(通常,当我使用等号连接ON a.col_x RLIKE b.col_z时,它只需要不到5分钟)。

任何解决方案(使用Hive或其他hadoop应用程序)都表示赞赏。

2 个答案:

答案 0 :(得分:1)

是," Hive不支持非平等条件的连接条件,因为很难表达诸如map / reduce作业之类的条件。"我认为这意味着equi-joins和自然连接(就像你的第二个例子)。

我会考虑在WHERE子句中使用RLIKE条件进行CROSS JOIN。根据数据的大小,您可能需要查看每个分区的查询。

在Pig中,您也可以进行交叉操作,然后按照您的条件进行过滤,类似于this post中的操作。

答案 1 :(得分:1)

在这种特殊情况下,您可以使用相等的方法轻松替换不相等的条件:

 a.col_x RLIKE concat('^', b.col_z)

相同
substr(a.col_x,1,length(b.col_z))=b.col_z