2

次の行で始まる ipython ノートブック セッションで、Oracle JDK 1.8 (ビルド 1.8.0_65-b17) で Spark 1.6.0 を実行しているとします。

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

そのため、databricks spark-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。これは明らかに、上記の javax.xml.stream クラスのいくつかによってスローされる XMLStreamException の場合です。

残念ながら、例外の詳細はハンドラーによって省略されるため、行の何が問題なのか正確にはわかりません。ただし、属性から名前空間を削除すると (つまり、r:id単に になりますid)、それがなくなります。私はいくつかの一般的な落とし穴にぶつかったと感じています.どれを知る必要があります.

UPD: デバッグ ステートメントを使用して、databricks lib の独自の jar をコンパイルしましたが、バインドされていないプレフィックスに関するものであることが判明しました。

: 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)

理由は何ですか?どうすれば修正できますか?

4

1 に答える 1

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 ファイルを読み取ることは可能ですが、名前空間を処理するためのより良い解決策を考えるべきだと思います。

于 2016-01-27T04:40:19.057 に答える