GlobalWindow无法强制转换为IntervalWindow

时间:2016-03-14 17:06:10

标签: google-cloud-dataflow

我正在尝试对csv文件中的一组元组运行滑动窗口计算。每行都有一个与之关联的日期。在使用TextIO.Read阅读csv文件后,我应用ParDo转换来更改PCollection中每个元素的时间戳。

//Reading and time stamping the stock prices
PCollection<KV<Integer, StockPricePoint>> stockPrices = pipeline
  .apply(TextIO.Read.from("./inputFiles/2004.csv"))
  .apply(ParDo.of(new DoFn<String, KV<Integer, StockPricePoint>>() {
    @Override
    public void processElement(ProcessContext c) throws Exception {
      String[] fields = c.element().split(",");
      try {
        StockPricePoint stockPoint = new StockPricePoint();
        stockPoint.setId(fields[0]);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd");
        stockPoint.setDate(sdf.parse(fields[1].trim()));
        stockPoint.setSymbol(fields[2]);
        stockPoint.setPrice(Double.parseDouble(fields[5].trim()));
        stockPoint.setCap(Double.parseDouble(fields[6].trim()));
        Instant instant = new Instant(stockPoint.getDate().getTime());
        c.outputWithTimestamp(KV.of(
          symbolEncoder.getSymbolIndex(stockPoint.getSymbol()), stockPoint), 
          instant);
      } catch (Exception ex) {
        //Todo accumulate errors
        ex.printStackTrace();
      }
    }
  });

然后我按如下方式应用滑动窗口转换

//creating the sliding windows
PCollection<KV<Integer, StockPricePoint>> slidingWindowStockPrices = stockPrices
  .apply(Window.<KV<Integer, StockPricePoint>>into(
    SlidingWindows.of(Duration.standardDays(30))
        .every(Duration.standardDays(5)));

在我按照以下方式调用GroupByKey转换后,我得到 GlobalWindow cannot be cast to IntervalWindow 异常。这可能会出现什么问题?

   slidingWindowStockPrices.apply(GroupByKey.create());

可以在http://pastebin.com/QUStvrfB

找到完整的堆栈跟踪

2 个答案:

答案 0 :(得分:1)

这似乎不是Google Cloud Dataflow服务的问题。您也可以尝试DirectPipelineRunner进行本地测试。

它似乎是Spark运行器的问题,它可能尚未实现在全局窗口中触发所需的完整语义。现在,Spark Beam(Incubating)项目维护了Spark runner。我已经在项目的Jira上提交了ticket来跟踪这个问题。

答案 1 :(得分:0)

我试图在我写的单元测试中重现这种行为。请参阅:https://issues.apache.org/jira/browse/BEAM-112

我已使用您的代码段进行功能测试以尝试重现但我无法重现此问题。 但是我注意到你在使用Spark早期版本的Spark之前(或者甚至是Cloudera的spark-dataflow),所以尝试更新你的spark runner可能值得一试。

如果我在这里遗漏了任何内容,请告诉我。