我正在尝试(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
(表A约100M条记录,表B约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 小时但仍然无法获得输出(通常,当我使用 equality join ON a.col_x RLIKE b.col_z
时,它只需要不到 5 分钟)。
欢迎任何解决方案(使用 Hive 或其他 hadoop 应用程序)。
最佳答案
是的,“Hive 不支持不是相等条件的连接条件,因为很难将此类条件表达为 map/reduce 作业。”我认为这意味着等连接和自然连接(就像你的第二个例子)。
我会考虑在 WHERE 子句中使用 RLIKE 条件执行 CROSS JOIN。根据数据的大小,您可能需要考虑按分区执行查询。
在 Pig 中,你也可以做一个交叉操作,然后根据你的条件进行过滤,类似于 this post 中所做的。 .
关于hadoop - 在 Hive 中使用 LIKE 或 RLIKE 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615744/