2016-01-26 11 views
2

Предположим, что я запускаю Spark 1.6.0 на Oracle JDK 1.8 (сборка 1.8.0_65-b17) в сеансе ноутбука ipython, начиная со следующей строки :SparkSQL с databricks xml lib: 'Malformed row'/UnboundPrefix на допустимом xml

PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS=notebook pyspark --packages com.databricks:spark-xml_2.10:0.3.1z 

Так я включил databricks искрового XML пакет (https://github.com/databricks/spark-xml). Далее я собираюсь запустить следующий код против pyspark:

dmoz = '/Users/user/dummy.xml' 
v=sqlContext.read.format('com.databricks.spark.xml').options(rowTag='Topic', failFast=True).load(dmoz) 
print v.schema 

где dummy.xml содержит этот крошечный фрагмент DMOZ дамп (http://rdf.dmoz.org/):

<?xml version="1.0" encoding="UTF-8"?> 
<RDF xmlns:r="http://www.w3.org/TR/RDF/" xmlns:d="http://purl.org/dc/elements/1.0/" xmlns="http://dmoz.org/rdf/"> 
    <!-- Generated at 2016-01-24 00:05:51 EST from DMOZ 2.0 --> 
    <Topic r:id=""> 
    <catid>1</catid> 
    </Topic> 
</RDF> 

Который проверяет против любого валидатора я «найти». И результат:

... 

Py4JJavaError: An error occurred while calling o82.load. 
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 1.0 failed 1 times, most recent failure: Lost task 0.0 in stage 1.0 (TID 1, localhost): java.lang.RuntimeException: Malformed row (failing fast): <Topic r:id=""> <catid>1</catid> </Topic> 
    at com.databricks.spark.xml.util.InferSchema$$anonfun$3$$anonfun$apply$2.apply(InferSchema.scala:101) 
    at com.databricks.spark.xml.util.InferSchema$$anonfun$3$$anonfun$apply$2.apply(InferSchema.scala:83) 

... 

Это относится к этой строке кода: https://github.com/databricks/spark-xml/blob/master/src/main/scala/com/databricks/spark/xml/util/InferSchema.scala#L101. Это, очевидно, случай XMLStreamException, созданный некоторыми из вышеперечисленных классов javax.xml.stream.

К сожалению, информация об исключении не указана обработчиком, поэтому я не могу сказать, что именно не так с строкой. Однако удаление пространства имен из атрибутов (т. Е. r:id становится только id) заставляет его уйти. Я чувствую, что попал в общую ловушку, просто нужно знать, какой из них.

UPD: Я собрал свою собственную баночку из databricks Lib с отладки заявления и оказывается, речь идет о несвязанных префиксов:

: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 1.0 failed 1 times, most recent failure: Lost task 0.0 in stage 1.0 (TID 1, localhost): javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,16] 
Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?Topic&r:id&r 
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:596) 

В чем причина и как это исправить?

ответ

1

Как вы описали в https://github.com/databricks/spark-xml/issues/74, это ошибка и проблема.

я мог воспроизвести эту ошибку, вы встречаетесь, выполнив ниже: Выход

val testFile = "path-for-xml" 
sqlContext.xmlFile(testFile, rowTag = "Topic").show() 

Консоль была

11:25:32.517 WARN com.databricks.spark.xml.util.InferSchema$: Dropping malformed row: <Topic r:id="">  <catid>1</catid> </Topic> 
root 

Я открыл PR для этого, https://github.com/databricks/spark-xml/pull/75.

В настоящее время я передал PR только для этой библиотеки, чтобы игнорировать пространства имен, но, возможно, некоторые из них будут иметь дело с этим.

Итак, в любом случае было бы возможно прочитать XML-файл в следующей версии, но я думаю, что мы должны подумать над лучшим решением для обработки пространств имен.

 Смежные вопросы

  • Нет связанных вопросов^_^