2017-01-10 13 views
0

私はXmlSource.fromを使用して、Cloud Storageバケットに格納されたXMLファイルから読み取ります。Google Cloud DataflowでXmlSourceを使用してXMLファイルを読み取るとClassCastExceptionが発生する

XmlSource<Data> source = XmlSource.<Data>from("gs://<my-url>/TestData.xml") 
     .withRootElement("data") 
     .withRecordElement("record") 
     .withRecordClass(Data.class); 

p.apply(Read.from(source)) 
     .apply(RemoveDuplicates.<Data>create()) 
     .apply(ParDo.of(new XMLPipeline.CreateItemQtyMapping())) 
     .apply(Combine.<String, Integer>perKey(new SumIntegers())) 
     .apply("FormatResults", MapElements.via(
       new SimpleFunction<KV<String, Integer>, String>() { 
        @Override 
        public String apply(KV<String, Integer> input) { 
        return input.getKey() + "," + input.getValue(); 
        } 
       })) 
     .apply(TextIO.Write.to("gs://<my-url>.appspot.com/pos-pipeline-output/ItemCounts")); 

p.run(); 

しかし、私はこの例外を取得しています:

017-01-09T14:01:31.107Z: Error: (c88c756cabe0dbec): java.io.IOException: Failed to start reading from source: StaticValueProvider{value=gs://<my-url>/TestData.xml} range [48524, 97048) 
at com.google.cloud.dataflow.sdk.runners.worker.WorkerCustomSources$BoundedReaderIterator.start(WorkerCustomSources.java:534) 
at com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation$SynchronizedReaderIterator.start(ReadOperation.java:387) 
at com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.runReadLoop(ReadOperation.java:217) 
at com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.start(ReadOperation.java:182) 
at com.google.cloud.dataflow.sdk.util.common.worker.MapTaskExecutor.execute(MapTaskExecutor.java:69) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.executeWork(DataflowWorker.java:284) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.doWork(DataflowWorker.java:220) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.getAndPerformWork(DataflowWorker.java:170) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.doWork(DataflowWorkerHarness.java:192) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:172) 
at com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:159) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassCastException: com.sun.xml.internal.stream.XMLInputFactoryImpl cannot be cast to org.codehaus.stax2.XMLInputFactory2 
    at com.google.cloud.dataflow.sdk.io.XmlSource$XMLReader.setUpXMLParser(XmlSource.java:490) 
    at com.google.cloud.dataflow.sdk.io.XmlSource$XMLReader.startReading(XmlSource.java:356) 
    at com.google.cloud.dataflow.sdk.io.FileBasedSource$FileBasedReader.startImpl(FileBasedSource.java:528) 
    at com.google.cloud.dataflow.sdk.io.OffsetBasedSource$OffsetBasedReader.start(OffsetBasedSource.java:281) 
    at com.google.cloud.dataflow.sdk.runners.worker.WorkerCustomSources$BoundedReaderIterator.start(WorkerCustomSources.java:531) 
    ... 14 more 

これらは私のpom.xmlでの依存関係は、次のとおりです。

<dependencies> 
<dependency> 
    <groupId>com.google.cloud.dataflow</groupId> 
    <artifactId>google-cloud-dataflow-java-sdk-all</artifactId> 
    <version>1.9.0</version> 
</dependency> 

<dependency> 
    <groupId>com.google.cloud</groupId> 
    <artifactId>google-cloud-storage</artifactId> 
    <version>0.7.0</version> 
</dependency> 

<dependency> 
    <groupId>org.codehaus.woodstox</groupId> 
    <artifactId>stax2-api</artifactId> 
    <version>4.0.0</version> 
</dependency> 

私はここで間違っているのかわからないです。誰かが何か指摘してもらえますか?

おかげで、

アビシェーク

+0

これはバグかもしれないようです。少し深く掘り下げるつもりですが、SDK 1.8.0を使用して回避することができます。 –

答えて

1

これは少し微妙ですが、あなたはまた、適切なランタイムの依存関係を含める必要が同じように見えます。

  1. 明示的org.codehaus.woodstoxの依存を宣言します:stax2-APIを

  2. は、このような組織として 、実行時にクラスパス上の互換性のある実装を含めるhttps://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/io/XmlSourceによると、あなたがしたいです.codehaus.woodstox:woodstox-core-asl

#1ではなく#2を正しく実行したようです。私は とjava.lang.ClassCastExceptionを解決するための

0

:com.sun.xml.internal.stream.XMLInputFactoryImplは答えは唯一使用にしたorg.codehaus.stax2.XMLInputFactory2

にキャストすることはできませんorg.codehaus.woodstoxの依存:既にSTAXとstax2に間接的依存性(javax.xml.stream - STAX-API、org.codehaus.woodstox - stax2-API)を有するwoodstox.core.asl

関連する問題