2017-01-10 3 views
0

Я использую XmlSource.from для чтения из файла XML, хранящегося в вещевом хранилище.ClassCastException при чтении XML-файла с использованием XmlSource в облачном потоке Google

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

Это немного тонкий, но, похоже, вы также должны включать в себя соответствующую зависимость времени выполнения. Согласно https://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/io/XmlSource, вы хотите:

  1. Явных объявить зависимость от org.codehaus.woodstox: stax2-апите

  2. Включать совместимую реализацию на пути к классам во время выполнения, таких как орг .codehaus.woodstox: woodstox-core-asl

Похоже, вы правильно сделали # 1, но не # 2.

0

для меня, чтобы решить java.lang.ClassCastException: com.sun.xml.internal.stream.XMLInputFactoryImpl не может быть приведен к org.codehaus.stax2.XMLInputFactory2

ответ был использовать только в зависимость для org.codehaus.woodstox: woodstox.core.asl

который уже имеет косвенные зависимости для STAX и stax2 (javax.xml.stream - StAX-API, org.codehaus.woodstox - stax2-API) ,

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