过滤器上的猪 udf

Posted

技术标签:

【中文标题】过滤器上的猪 udf【英文标题】:Pig udf on Filter 【发布时间】:2015-07-28 11:57:38 【问题描述】:

我有一个用例,我需要输入一个月的日期来返回上个月的最后日期。

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
        

需要帮助。提前致谢。

【问题讨论】:

你应该接受 Balduz 的回答,除非你觉得它不令人满意(在我看来是对的) 【参考方案1】:

您可以在 FILTER 中调用 UDF,但您正在向函数传递一个数字,而您希望它接收 String(Pig 内部的chararray):

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

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

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 的值是错误的。

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

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;
        
    
 

【讨论】:

以上是关于过滤器上的猪 udf的主要内容,如果未能解决你的问题,请参考以下文章

使用外部 Java 库的猪 UDF

Excel UDF 过滤器范围

spark UDF 结果可以“显示”,但不能“过滤”

在 pyspark 中应用 udf 过滤功能

Databricks 火花 UDF 不适用于过滤的数据帧

在 pyspark 中使用 pandas_udf 过滤数据框