【发布时间】:2016-08-16 19:32:30
【问题描述】:
当我尝试将 xml.gz 文件读入 Scala 时,收到以下错误:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:701)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:567)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1896)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1761)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1799)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:156)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
at scala.xml.factory.XMLLoader$class.loadXML(XMLLoader.scala:41)
at scala.xml.XML$.loadXML(XML.scala:60)
at scala.xml.factory.XMLLoader$class.loadFile(XMLLoader.scala:50)
at scala.xml.X
我有以下代码:
import scala.xml.XML
val xml = XML.loadFile("/home/vagrant/miniprojects/spark/allVotes/part-00380.xml.gz")
我有 2,000 多个 xml.gz 文件要读入。什么是有效的解决方案?非常感谢!!
【问题讨论】:
-
以尽可能完整且可测试的最小形式展示您的工作(您如何进行解析,尤其是您如何进行 gzip 解压缩)将是一个开始的地方。见stackoverflow.com/help/mcve
-
...那么,你根本没有在做 gzip 解压缩。不能像读取 XML 文件一样读取 gzip 文件,这有什么奇怪的?
-
感谢您的提醒。当我对文件进行压缩时,它占用了太多内存......
-
...如果您需要对一组组合的 XML 文档运行查询,这些文档需要的 RAM 比您可以存储的更多,请考虑为此目的使用 XQuery 数据库。 (忽略当您说“内存”时实际上是指磁盘存储时)。如果您无法将解压缩的文本存储在 RAM 中,那么您也没有足够的内存来存储从该文本构建的 DOM。