2

我将WindowsWordCount 示例程序的源代码从文本文件更改为云 Pub/Sub,如下所示。我将莎士比亚文件的数据发布到 Pub/Sub,这些数据确实被正确获取,但之后的任何转换.groupByKey似乎都不起作用。

sc.pubsubSubscription[String](psSubscription)
  .withFixedWindows(windowSize) // apply windowing logic
  .flatMap(_.split("[^a-zA-Z']+").filter(_.nonEmpty))
  .countByValue
  .withWindow[IntervalWindow]
  .swap
  .groupByKey
  .map {
    s =>
      println("\n\n\n\n\n\n\n This never prints \n\n\n\n\n")
      println(s)
  }
4

2 回答 2

4

将输入从文本文件更改为 PubSub PCollection “无界”。按键分组需要定义聚合触发器,否则分组器将永远等待。它在此处的数据流文档中提到: https ://cloud.google.com/dataflow/model/group-by-key

注意:为了在无界 PCollection 上执行 GroupByKey,需要非全局窗口化或聚合触发器。这是因为有界的 GroupByKey 必须等待收集到具有特定键的所有数据;但是对于无限的集合,数据是无限的。窗口化和/或触发器允许对无界数据流内的逻辑、有限数据包进行分组操作。

如果您将 GroupByKey 应用于无界 PCollection 而未设置非全局窗口策略、触发策略或两者,则在构建管道时 Dataflow 将生成 IllegalStateException 错误。

不幸的是,Apache Beam 的 Python SDK 似乎还不支持触发器,所以我不确定 python 中的解决方案是什么。

(见https://beam.apache.org/documentation/programming-guide/#triggers

于 2017-06-22T15:30:31.503 回答
1

关于上面 Franz 的评论(如果 StackOverflow 允许我,我会特别回复他的评论!,)我看到文档说没有实现触发......但他们也说实时数据库功能不可用,而我们的当前项目正在积极使用它们。他们只是新的。

在此处查看触发函数:https ://github.com/apache/beam/blob/master/sdks/python/apache_beam/transforms/trigger.py

请注意,API 尚未完成,因为这不是“可发布”的代码。但它是可用的。

于 2017-06-27T19:46:28.180 回答