【问题标题】:Join 2 tables in Hive using a phone number and a prefix (variable length)使用电话号码和前缀(可变长度)加入 Hive 中的 2 个表
【发布时间】:2012-10-12 15:28:03
【问题描述】:

我正在尝试使用 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 行收到错误“在 Join '1' 中遇到左右别名)

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

【问题讨论】:

    标签: join hive user-defined-functions hiveql


    【解决方案1】:

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

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

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

    【讨论】:

    • 不幸的是,我认为这是这种情况下的最佳解决方案,因为必须使用 udf 尝试所有匹配项才能测试相等性并丢弃
    • 我收回它,看起来可以完成,编写一个自定义 udf,它需要您的 2 个输入,例如customudf(users.nb, prefmap.prefix),你的比较 instr(users.nb,prefmap.prefix) = 1,并返回 true。在这里找到答案:stackoverflow.com/questions/18039235/…
    【解决方案2】:

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

    所以 hive 的 join 只支持相等表达式。请参阅hive joins wiki 了解更多信息。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多