Apache Beam:SQL聚合无界/有界联接没有结果

时间:2019-07-19 18:55:30

标签: apache-beam beam-sql

我正在研究运行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。 这里的示例很好用,但是当我用一个实际的无界源替换该源并进行聚合时,看不到任何结果。     我的管道中的步骤:

  1. 从源中读取有界数据并转换为行集合。
  2. 从websocket源读取无界json数据。
  3. 通过DoFn将时间戳分配给每个源流。
  4. 将无界json转换为无界行集合
  5. 在行集合上应用一个窗口
  6. 应用一条SQL语句。
  7. 输出sql的结果。

正常的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

在此实现中是否有我做错的事情。任何指针都将非常有帮助。

2 个答案:

答案 0 :(得分:0)

阅读代码时会出现一些建议:

  1. 扩展窗口以允许延迟并发出提早到达的数据。
 .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());

  1. 尝试删除join并检查是否没有输出到窗口,

  2. 尝试向窗口添加更多时间。因为有时太短而无法在工作人员之间重新整理数据。并且加入的流不会同时发出。

  3. 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