1

我正在尝试使用 Hive 将电话号码与某个区域匹配。我有一个表(prefmap),它将数字前缀(prefix)映射到一个区域(area)和另一个表(users),其中包含电话号码列表(nb)。每个电话号码只有 1 个匹配项(无子区域)

问题是前缀的长度不是固定的,所以我不能在 JOIN 的 ON() 条件中使用 UDF 函数 substr(nb,"prefix's length") 将数字的子字符串与前缀匹配。

当我尝试使用 instr() 来查找数字是否具有匹配的前缀时:

SELECT users.nb,prefix.area
FROM users 
LEFT OUTER JOIN prefix 
ON (instr(prefmap.prefix,users.nb)=1)

我在第 4 行收到错误“在加入‘1’中遇到左右别名)

我怎样才能让它工作?我正在使用 hive 0.9 感谢您的任何建议。

4

2 回答 2

4

可能不是最好的解决方案,但至少它完成了工作:使用 WHERE 定义匹配条件而不是 ON() (现在强制为 TRUE)

select users.nb, prefix.area  
from users  
LEFT OUTER JOIN prefix  
ON(true)  
WHERE instr(users.nb,prefmap.prefix)=1  

它并不完美,因为它有点慢。在 WHERE 条件保留唯一正确的条目之前,它会创建与匹配表中一样多的临时(无用)条目。所以最好只在不太长的情况下使用它。谁能想到更好的方法来做到这一点?

于 2012-10-25T14:47:52.513 回答
1

hive 无法转换(instr(prefmap.prefix,users.nb)=1)为 mapreduce 作业。

所以 hive 的 join 只支持相等表达式。有关更多信息,请参阅hive 加入 wiki

于 2012-11-01T16:16:12.587 回答