我试图(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应用程序)都表示赞赏。
答案 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