1

我有一个用例,我需要在一个月的日期中返回上个月的最后日期。

Ex: input:20150331 output:20150228

我将使用上个月的最后一个日期来过滤每日分区(在猪脚本中)。

B = filter A by daily_partition == GetPrevMonth(20150331);

我创建了一个 UDF(GetPrevMonth),它获取日期并返回上个月的最后一个日期。但无法在过滤器上使用它。

ERROR:Could not infer the matching function for GetPrevMonth as multiple or none of them fit. Please use an explicit cast.

我的 udf 将元组作为输入。谷歌搜索它说UDF不能应用于过滤器。有什么解决方法吗?还是我在某个地方出错了?

UDF:public class GetPrevMonth extends EvalFunc<Integer> {

    public Integer exec(Tuple input) throws IOException {
        String getdate = (String) input.get(0);
        if (getdate != null){
        try{
            //LOGIC to return prev month date
        }

需要帮助。在此先感谢。

4

1 回答 1

3

您可以在 a 中调用 UDF FILTER,但是您将一个数字传递给函数,而您希望它接收一个Stringchararray在 Pig 中):

String getdate = (String) input.get(0);

简单的解决方案是chararray在调用 UDF 时将其转换为:

B = filter A by daily_partition == GetPrevMonth((chararray)20150331);

通常,当您看到诸如 之类的错误时Could not infer the matching function for X as multiple or none of them fit,99% 的原因是您尝试传递给 UDF 的值是错误的。

最后一件事,即使没有必要,将来您可能想要编写一个纯FILTERUDF。在这种情况下EvalFunc,您需要继承 fromFilterFunc并返回一个Boolean值,而不是继承 from :

public class IsPrevMonth extends FilterFunc {
    @Override
    public Boolean exec(Tuple input) throws IOException {
        try {
            String getdate = (String) input.get(0);
            if (getdate != null){   
                //LOGIC to retrieve prevMonthDate

                if (getdate.equals(prevMonthDate)) {
                    return true;
                } else {
                    return false;   
                }
            } else {
                return false;
            }
        } catch (ExecException ee) {
            throw ee;
        }
    }
} 
于 2015-07-28T14:59:10.920 回答