我正在研究运行Apache管道的SQL聚合函数。参考:https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslJoinTest.java#L159。 这里的示例很好用,但是当我用一个实际的无界源替换该源并进行聚合时,看不到任何结果。 我的管道中的步骤:
正常的SQL语句执行并输出结果。但是,当我在SQL中使用group by时,没有输出。
SELECT
o1.detectedCount,
o1.sensor se,
o2.sensor sa
FROM SENSOR o1
LEFT JOIN AREA o2
on o1.sensor = o2.sensor
结果是连续的,如下所示。
2019-07-19 20:43:11 INFO ConsoleSink:27 - {
"detectedCount":0,
"se":"3a002f000647363432323230",
"sa":"3a002f000647363432323230"
}
2019-07-19 20:43:11 INFO ConsoleSink:27 - {
"detectedCount":1,
"se":"3a002f000647363432323230",
"sa":"3a002f000647363432323230"
}
2019-07-19 20:43:11 INFO ConsoleSink:27 - {
"detectedCount":0,
"se":"3a002f000647363432323230",
"sa":"3a002f000647363432323230"
}
将sql更改为
时,结果根本不显示SELECT
COUNT(o1.detectedCount) o2.sensor sa
FROM SENSOR o1
LEFT JOIN AREA o2
on o1.sensor = o2.sensor
GROUP BY o2.sensor
在此实现中是否有我做错的事情。任何指针都将非常有帮助。
答案 0 :(得分:0)
阅读代码时会出现一些建议:
.apply("windowing", Window.<Row>into(FixedWindows.of(Duration.standardSeconds(2)))
.triggering(AfterWatermark.pastEndOfWindow()
.withEarlyFirings(AfterProcessingTime.pastFirstElementInPane()
.plusDelayOf(Duration.standardSeconds(1)))
.withLateFirings(AfterProcessingTime.pastFirstElementInPane()
.plusDelayOf(Duration.standardSeconds(2))))
.withAllowedLateness(Duration.standardMinutes(10))
.discardingFiredPanes());
尝试删除join
并检查是否没有输出到窗口,
尝试向窗口添加更多时间。因为有时太短而无法在工作人员之间重新整理数据。并且加入的流不会同时发出。
outputWithTimestamp
将以不同的时间戳输出行,然后在不允许延迟时可以将其删除。
阅读outputWithTimestamp
的文档,此API有点冒险。
如果输入的{@link PCollection}元素带有时间戳,则输出 每个元素的时间戳不能早于输入元素的时间戳 时间戳减去{@link getAllowedTimestampSkew()}的值。如果 输出时间戳在此时间之前,转换将抛出一个 {@link IllegalArgumentException}执行时。使用{@link withAllowedTimestampSkew(Duration)}更新允许的偏斜。
注意:使用{@link #withAllowedTimestampSkew(Duration)}许可 在水印后发出的元素。这些元素是 考虑晚了,如果落后于{@link 下游的Window#withAllowedLateness(Duration)允许延迟} {@link PCollection}可能会被静默删除。
答案 1 :(得分:0)
选择 COUNT(o1.detectedCount)作为数字 ,o2。传感器 ,sa 从传感器o1 左外连接区o2 在o1.sensor = o2.sensor GROUP BY sa,o1.sensor,o2.sensor