Apache pig 如何使用PIG UDF和Apache Tika从PDF中提取文本?

Apache pig 如何使用PIG UDF和Apache Tika从PDF中提取文本?,apache-pig,apache-tika,Apache Pig,Apache Tika,我正试图编写一个PIG eval函数(UDF),使用apachetika从pdf文件中提取文本。但是,每当我尝试运行函数时,函数只向输出写入0或1个字节。如何修复我的代码 public class ExtractTextFromPDFs extends EvalFunc<String> { @Override public String exec(Tuple input) throws IOException { String pdfText; i

我正试图编写一个PIG eval函数(UDF),使用apachetika从pdf文件中提取文本。但是,每当我尝试运行函数时,函数只向输出写入0或1个字节。如何修复我的代码

public class ExtractTextFromPDFs extends EvalFunc<String> {

  @Override
  public String exec(Tuple input) throws IOException {
      String pdfText;

      if (input == null || input.size() == 0 || input.get(0) == null) {
          return "N/A";
      }

      DataByteArray dba = (DataByteArray)input.get(0);
      InputStream is = new ByteArrayInputStream(dba.get());
      ContentHandler contenthandler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      Parser pdfparser = new AutoDetectParser();

      try {
        pdfparser.parse(is, contenthandler, metadata, new ParseContext());
      } catch (SAXException | TikaException e) {
        e.printStackTrace();
      }
      pdfText = contenthandler.toString();

      //close the input stream
      if(is != null){
        is.close();
      }
      return pdfText;
  }
}
公共类extractTextFromPDF扩展了EvalFunc{
@凌驾
公共字符串exec(元组输入)引发IOException{
字符串pdfText;
if(input==null | | input.size()==0 | | input.get(0)==null){
返回“不适用”;
}
DataByteArray dba=(DataByteArray)input.get(0);
InputStream is=newbytearrayinputstream(dba.get());
ContentHandler ContentHandler=新的BodyContentHandler();
元数据=新元数据();
Parser pdfparser=new AutoDetectParser();
试一试{
parse(is,contenthandler,metadata,new ParseContext());
}捕获(SAXException | TIKAE异常){
e、 printStackTrace();
}
pdfText=contenthandler.toString();
//关闭输入流
如果(is!=null){
is.close();
}
返回pdfText;
}
}

我使用'c=foreach b generate extractTextFromPDF(content);'运行代码其中b是pdf,内容是bytearray。

如果在调试器中单步执行代码,参数“input”是什么样子的?您正在使用的代码看起来与stackoverflow answer中的代码类似,区别在于它们使用PDFParser而不是AutoDetectParser,并且它们直接从FileInputStream而不是元组获取内容。