我正在尝试对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());
找到完整的堆栈跟踪
答案 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可能值得一试。
如果我在这里遗漏了任何内容,请告诉我。