Hadoop 错误2078:从UDF捕获错误

Hadoop 错误2078:从UDF捕获错误,hadoop,apache-pig,pig-udf,Hadoop,Apache Pig,Pig Udf,我收到错误“error 2078:catched error from UDF:com.Hadoop.pig.SplitRec[catched exception processing input row[1]]”。我确定输入字符串超出了范围,但我不确定是哪个记录(记录编号)导致了问题 我正在尝试创建日志以显示导致问题的记录,但我不确定是否要调试以打印/记录错误记录 输入如下所示: **PXW01YIN 12000099PGEN PXW01YINFFFFFFFF PXW01YINIMFGUIPY

我收到错误“error 2078:catched error from UDF:com.Hadoop.pig.SplitRec[catched exception processing input row[1]]”。我确定输入字符串超出了范围,但我不确定是哪个记录(记录编号)导致了问题

我正在尝试创建日志以显示导致问题的记录,但我不确定是否要调试以打印/记录错误记录

输入如下所示:

**PXW01YIN 12000099PGEN PXW01YINFFFFFFFF PXW01YINIMFGUIPY04301Y301 JFK 00888JFK 008880001 PIMF 0000N/ACTRC5/TXN08/SCR301\/SEQ/TEX021\@

PXW01PIN 12000099PGEN PXW01PINFFFFFFF PXW01PINIMFGUIAV04301P301每03615PER 0361500001 PIMF 0000N/ACTRCK/TXN08/SCR301\/SEQ/TEX021\@**

上面的几行是两条记录,我已经对它们进行了测试(使用LIMIT),它们并没有引起问题。我有超过150kb的输入数据

我正在使用的脚本:

   SPLT_REC1 = load  '/user/hduser/output/realdata/pig_out6/part-m-00000' as (tran_array:chararray);
   register /home/cloudera/workspace/SplitRec.jar;
   define SplitRec com.Hadoop.pig.SplitRec();
   SPLT_REC2 = foreach SPLT_REC1 generate SplitRec(tran_array);
   store SPLT_REC2 into '/user/hduser/output/realdata/pig_out7';





package com.Hadoop.pig;
import  java.io.IOException;

import  org.apache.pig.EvalFunc;
import  org.apache.pig.data.Tuple;
import  org.apache.pig.impl.util.WrappedIOException;

@SuppressWarnings("deprecation")
public class SplitRec extends EvalFunc<String> {
public String exec(Tuple input) throws IOException {
    if (input == null || input.size() == 0)
        return null;

    try {
        String Str1 = (String)input.get(0);
        String delim1 = "PIMF+";
        String[] tokens1 = Str1.split(delim1);

        String part3 = tokens1[0];
        String part4 = tokens1[1];
        int len1 = part4.length();
        String part5 = part4.substring(8,len1);

        String conCat1 = part3+":"+part5;
        return conCat1;
    }
    catch(Exception e) {
        throw WrappedIOException.wrap("Caught exception processing input row ", e);
    }

}
SPLT_REC1=load'/user/hduser/output/realdata/pig_out6/part-m-00000'as(传输阵列:chararray);
register/home/cloudera/workspace/SplitRec.jar;
定义SplitRec com.Hadoop.pig.SplitRec();
SPLT_REC2=foreach SPLT_REC1生成SplitRec(传输数组);
将SPLT_REC2存储到“/user/hduser/output/realdata/pig_out7”中;
包com.Hadoop.pig;
导入java.io.IOException;
导入org.apache.pig.EvalFunc;
导入org.apache.pig.data.Tuple;
导入org.apache.pig.impl.util.WrappedIOException;
@抑制警告(“弃用”)
公共类SplitRec扩展了EvalFunc{
公共字符串exec(元组输入)引发IOException{
if(input==null | | input.size()==0)
返回null;
试一试{
String Str1=(String)input.get(0);
字符串delim1=“PIMF+”;
String[]tokens1=Str1.split(delim1);
字符串part3=tokens1[0];
字符串part4=tokens1[1];
int len1=part4.length();
字符串part5=part4.子字符串(8,len1);
字符串conCat1=part3+“:”+part5;
返回conCat1;
}
捕获(例外e){
抛出WrappedIOException.wrap(“捕获异常处理输入行”,e);
}
}

让异常打印出每个部分,比如
抛出WrappedIOException.wrap(“捕获的异常处理输入行|”+tokens1+“|”+part3+“|”+part4”,e)
感谢您的回复,但我不确定我们是否可以在抛出时使用变量,因为变量不在catch块的范围内。使用您提供的代码,我收到一条错误消息:“part4无法解析为变量-part3无法解析为变量-tokens1无法解析为变量“只需制作globals进行测试,看看会发生什么。确保从
SPLT_REC1
加载的数据格式正确且符合预期。您可以尝试
演示SPLT_REC1;
感谢您的帮助。似乎只是输入记录有问题。我已将UDF中的验证更改为:if(!Str1.substring(114118).equalsIgnoreCase(pImf)){return null;}它根据要求为我工作。让异常打印出每个部分,比如
throw WrappedIOException.wrap(“捕获的异常处理输入行|“+tokens1+”|“+part3+”|“+part4”,e)
感谢您的回复,但我不确定我们是否可以在抛出时使用变量,因为变量不在catch块的范围内。使用您提供的代码,我收到一条错误消息:“part4无法解析为变量-part3无法解析为变量-tokens1无法解析为变量“只需制作globals进行测试,看看会发生什么。确保从
SPLT_REC1
加载的数据格式正确且符合预期。您可以尝试
演示SPLT_REC1;
感谢您的帮助。似乎只是输入记录有问题。我已将UDF中的验证更改为:if(!Str1.substring(114118).equalsIgnoreCase(pImf)){return null;}它根据要求为我工作。