在将数据加载到Hive表之前,我必须在平面文件中格式化数据。
CF32|4711|00010101Z| +34.883| 98562AS1D |N8594ãä| 00 | 2
文件是管道分隔的,我需要在平面文件的不同列上应用不同的清理和格式化功能。 我有多个函数来Clean_Text,Format_Date,Format_TimeStamp,Format_Integer等。
我的想法是将架构作为构造函数传递给我的UDF,并调用pig中平面文件中的不同函数。
A = LOAD 'call_detail_records' USING org.apache.hcatalog.pig.HCatLoader();
DESCRIBE A;
REGISTER ZPigUdfs.jar;
DEFINE DFormat com.zna.pig.udf.DataColumnFormatter(A);
B = FOREACH A GENERATE DFormat($0);
DUMP B;
但是我怎样才能传递架构? DUMP A实际上转储整个表,但我只需要元数据。 我当前的UDF伪代码看起来像
public class DataColumnFormatter扩展了EvalFunc {
private Tuple schema;
public DataColumnFormatter(Tuple schema) {
this.schema = schema;
}
@Override
public String exec(Tuple inputTuple) throws IOException {
if (inputTuple != null && inputTuple.size() > 0) {
String inpString = inputTuple.get(0).toString();
System.out.println(inpString);
System.out.println(schema);
/**
* Logic for splitting the string as pipe and apply functions based
* on positions of schema if(schema[1] -> date ){
*
* formatDate(input) }else if(schema[1] -> INT ){
*
* formatInt(input); }
*
*/
}
return null;
}
}
如何在PIG UDF中获取模式,或者是否有其他方法可以实现此目的。
提前致谢。
答案 0 :(得分:1)
从你的EvalFunc中你可以调用this.getInputSchema()
(至少从Pig v0.12开始,也许更早)。您不需要做任何特殊的事情来传递模式,并且从HCatalog加载后,A
已经被装饰。
或者,您可以考虑为每种数据类型分离单独的UDF函数。像B = FOREACH A GENERATE dateFormat($0), cleanText($1), dateFormat($2);