用于添加列的 java udf

Posted

技术标签:

【中文标题】用于添加列的 java udf【英文标题】:java udf for adding columns 【发布时间】:2015-08-12 09:44:01 【问题描述】:

我正在编写 java udf 函数以通过比较位置列来添加 pincode。这是我的代码。

  import java.io.IOException;
  import org.apache.pig.EvalFunc; 
  import org.apache.pig.data.Tuple;
  import org.apache.commons.lang3.StringUtils;
  public class MB_pincodechennai extends EvalFunc<String>
  
    private String pincode(String input)
    
      String property_pincode = null;
      String[] items = new String[]"600088", "600016", "600053", "600070", "600040", "600106", "632301", "600109", "600083", "600054", "600023", "600095", "600077", "600073", "600003", "603001", "600064", "600094", "600044", "600008",
      ;

      for (String itm : items)
      
        if (StringUtils.containsIgnoreCase(input, itm))
        
          property_pincode = itm;
          break;
        
      
      return property_pincode;
    

    public String exec(Tuple input) throws IOException
    
      if (input == null || input.size() == 0)
        return null;
      try
      
        String str = (String) input.get(0);
        return pincode(str);
      
      catch (Exception e)
      
        return null;
      
    
  

这个地方看起来像这样 adyar,tambaram,pallavaram,chromepet...

当我运行上面它只打印空白值。我不知道我的错误在哪里。任何帮助将不胜感激。

【问题讨论】:

您能否展示您发送到 UDF 的输入列中的数据示例? 【参考方案1】:

如果您更改以下内容以返回“无效输入”。那么你会在 Pig 控制台中得到 Invalid Input。

catch (Exception e)

return null;   // Change this to return "Invalid Input"

原因:

问题是您试图从 Pig 脚本中传递 pincode=600073(即整数)。并且您正在将其作为 Java UDF 中的字符串读取。此铸造不起作用。

 MB_pincodechennai(pincode) -- pincode is passed as integer.

对于这个问题,您有 2 种方法; 1) 您可以在 pig 脚本中将 pincode 字段作为 String 而不是 int。

2) 在进行匹配之前,您可以在 Java 结束时从 Integer 解析为 String。

String str = Integer.toString(input);

请查看 Mapping 以了解有关握手的更多详细信息: http://pig.apache.org/docs/r0.11.0/udf.html#udf-java

【讨论】:

以上是关于用于添加列的 java udf的主要内容,如果未能解决你的问题,请参考以下文章

使用 udf 传递列作为参数将自定义列添加到 pyspark 数据帧

如何使用Java UDF将新列添加到Spark数据帧

专门用于添加列的 QAbstractProxyModel:表格单元格变为空

如何创建 Pyspark UDF 以向数据框添加新列

Scala:可变参数 UDF

将多个表中的多行用于具有标量 UDF 的持久计算列