i am writing java udf function to add the pincode by comparing the locality column.here is my code.
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
{
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;
}
}
}
the locality looks like this adyar,tambaram,pallavaram,chromepet...
when i run the above it prints blank values only.i dont know where i am my mistake.any help will be appreciated.
解决方案
if you change the following to return "Invalid Input". then you will get Invalid Input in Pig Console.
catch (Exception e)
{
return null; // Change this to return "Invalid Input"
}
Reason :
Issue is you are trying to pass pincode=600073 (i.e.Integer) from Pig Script.And you are reading it as String in Java UDF. This casting wont work.
MB_pincodechennai(pincode) -- pincode is passed as integer.
For this Issue, you have 2 methods ;
1) Either you can have pincode field as String instead of int in pig script.
2) You can or else parse from Integer to String in Java end before doing the match.
String str = Integer.toString(input);
Please have a look at Mapping for more details on handshakes :
http://pig.apache.org/docs/r0.11.0/udf.html#udf-java