0

我正在 hive 的两个表上进行左外连接。

table 1 : name1
table 2 : name2 , class ( only two values Y or N)

表 1 中的名称是表 2 的超集。

最终结果表应该有 name1, class

我的查询是

select table1.name1 , translate(table2.class,NULL,'N') 
from table1 left outer join table2 
on (name1= name2);

这行得通吗?

我也尝试过 reexp_replace 但它不起作用

select table1.name1, regexp_replace(table2.class,NULL,'N') from table1 left outer join table2 on (name1= name2);

4

1 回答 1

1

当我编写 Hive 翻译 UDF 时,我希望保持与 PostGreSQL 中的翻译 UDF 相同的行为。与 PostGreSQL 类似,如果转换 UDF 的任何参数为 NULL,则结果将为 NULL。

这也体现在 UDF 的 Hive 源代码的以下行中:

if (arguments[0].get() == null || arguments[1].get() == null || arguments[2].get() == null) {
      return null;
    }

完整的源代码可在此处获得。

根据我从您的问题中了解到的情况,当名称存在于 table1 但不存在于 table2 时,您想发出“N”。如果我这样做,我会做类似(未经测试)的事情:

SELECT
   table1.name1,
   COALESCE(table2.name2, 'N') as name2
FROM
   table1
   LEFT OUTER JOIN
   table2
   ON (table1.name1 = table2.name2);

您可以在Hive UDF wiki 页面上了解有关 coalesce UDF 的更多信息。

感谢您的问题,我已经更新了Hive UDF wiki 页面上对翻译 UDF 的描述,以澄清输入参数之一为 NULL 的情况。

于 2012-06-28T17:50:06.723 回答