3

我正在尝试(内部)使用 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 约 100M 记录,tableB 约 1k 记录)

此查询不起作用,因为 Hive 仅支持相等连接。

我将不等式移至where子句(参考:连接表时 Hive 查询中的错误)。

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 应用程序)都值得赞赏。

4

2 回答 2

1

在这种特殊情况下,您可以轻松地将不相等条件替换为相等条件:

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

是相同的

substr(a.col_x,1,length(b.col_z))=b.col_z
于 2016-09-22T13:18:27.267 回答
1

是的,“Hive 不支持非相等条件的连接条件,因为很难将此类条件表达为 map/reduce 作业。” 我认为这意味着等值连接和自然连接(如您的第二个示例)。

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

在 Pig 中,您还可以进行交叉操作,然后根据您的条件进行过滤,类似于本文中所做

于 2016-09-22T03:17:37.377 回答