hadoop hdfs xml解析出错: Invalid UTF-8 middle byte 0x7b

发布于 2022-09-06 11:38:08 字数 2621 浏览 12 评论 0

  1. 用将xml文件上传到hdfs中,上传前使用stax的方式进行解析过,没问题。结果从hdfs中以inputstream的方式在本地再次使用stax解析,结果出错。
  2. 上传代码
//已追加方式上传到hdfs中
//记录文件的其实位置
fileInfo.setOffset(writeFs.getFileStatus(curPath).getLen());

FileSystem writeFs = FileSystem.get(configuration);
OutputStream out = writeFs.append(curPath);
//以字节方式拷贝到hdfs上
IOUtils.copyBytes(new FileInputStream(file), out, 4096, true);

//记录文件的长度
fileInfo.setSize((int) (writeFs.getFileStatus(curPath).getLen() - fileInfo.getOffset()));

在hdfs获得的inputstream的代码


FSDataInputStream in = FileSystem.get(configuration).open(curPath));
in.seek(offset);//跳转到文件的起始位置

stax解析代码

public abstract class StaxHandler<T> {
    private XMLEventReader xmlEventReader;

    private boolean stop = false;
    private String firstElement = null;

    protected String nextData() throws XMLStreamException {
        XMLEvent event = xmlEventReader.nextEvent();
        if (event.isCharacters()) {
            return event.asCharacters().getData();
        } else if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(firstElement)) {
            stop = true;
        }
        return "";
    }

    protected boolean hasNext() {
        return !stop && xmlEventReader.hasNext();
    }

    protected XMLEvent nextEvent() throws XMLStreamException {
        XMLEvent event = xmlEventReader.nextEvent();
        if (event.isStartElement() && Objects.isNull(firstElement)) {
            // 记录xml的根元素,后面EndElement中是根元素就停止读取
            firstElement = event.asStartElement().getName().getLocalPart();
        } else if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(firstElement)) {
            stop = true;
        }
        return event;
    }

    public void setXmlEventReader(XMLEventReader xmlEventReader) {
        this.xmlEventReader = xmlEventReader;
    }

    abstract public void parse() throws XMLStreamException;

    abstract public T getResult();
}
  1. 报错截图

clipboard.png
结果在解析过程中出错了

  1. 尝试

上传前解析过没有问题,上传后在从hdfs中以inputstream读取解析有问题。所以先读取保存到本地之后,在对保存后的文件进行解析,这个也没有问题。
保存到本地代码

FSDataInputStream in = FileSystem.get(configuration).open(curPath));
in.seek(offset);//跳转到文件的起始位置
IOUtils.copyBytes(in, new FileOutputStream("123.xml"), fileLength, true);
//在对123.xml以stax方式进行解析,结果对着。

网上也没找到有用的信息,不知道是啥问题,特此请教。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文