【问题标题】:How to use Google Datastore CompositeFilter with Dataflow?如何将 Google Datastore CompositeFilter 与 Dataflow 结合使用?
【发布时间】:2018-11-25 12:14:12
【问题描述】:

当从 Datastore 读取数据作为管道的输入时,我可以创建一个“简单”查询,在其中我在单个属性上设置一个过滤器,如下所示:

Pipeline p = ...
Filter filter = Filter.newBuilder()
        .setPropertyFilter(PropertyFilter.newBuilder()
                .setProperty(PropertyReference.newBuilder()
                        .setName("propertyA"))
                .setOp(PropertyFilter.Operator.EQUAL)
                .setValue(Value.newBuilder().setStringValue("valueA").build())
                .build())
        .build();

Query query = Query.newBuilder()
    .addKind(KindExpression.newBuilder().setName("myKind").build())
                .setFilter(filter)
                .build();
p.apply("read", DatastoreIO.v1().read().withProjectId("myProjectId")
                .withNamespace("myNamespace").withQuery(query)).apply(.....

当我尝试通过连接“setFilter()”调用对查询应用多个过滤器时,只有最后一个设置的过滤器应用于查询。

经过一些研究,我发现了一个 CompositeFilter,它应该可以启用多个过滤器的组合。我可以构建一个复合过滤器,但是当我想在查询中将其设置为过滤器时,IDE 会抱怨类型不匹配,并且似乎没有其他方法可以应用过滤器。

我设法通过 GQL 使用具有多个过滤器的查询,并且可以在日志中看到它已转换为 CompositeFilter。我不是在这里抱怨,因为 GQL 的使用比手动构建查询/过滤器要好得多,但我想问一下如何在 DatastoreIO.v1().read(. ...) 或者如果不可能的话。

我正在使用 com.google.cloud.dataflow/google-cloud-dataflow-java-sdk-all/2.2.0

感谢您的帮助。

【问题讨论】:

  • 您能否编辑帖子,以包含您尝试过的 CompositeFilter(IDE 会警告您)?
  • Holy **** 我刚刚在 Filter.Builder 上看到了一个名为“setCompositeFilter”的方法。这将是要走的路。然后您可以在 Query.Builder 上设置该过滤器...如上所述,我现在正在使用 GQL,并且对该解决方案感到满意。但很高兴现在知道如何做到这一点。 CompositeFilter 来自 com.google.datastore.v1.CompositeFilter
  • 根据文档,您可以。您可以使用CompositeFilter newBuilder 方法,并创建如下过滤器:Filter composeFilter = Filter.newBuilder() .setCompositeFilter(CompositeFilter.newBuilder().addFilters(filter1).addFilters(filter2).build()).build(); Filter1 和 Filter2 这里是您创建的过滤器。我的 IDE 允许我这样做(我使用的是 IntelliJ IDEA,最新版本)。
  • 是的,就像我之前说的,我没有看到那个方法 :-) 无论如何,谢谢!如果你愿意,你可以回答,我会接受的
  • 已发布! :) 谢谢。

标签: google-cloud-datastore google-cloud-dataflow apache-beam


【解决方案1】:

根据文档,您可以。您可以使用CompositeFilter newBuilder 方法,并创建如下过滤器:

Filter composeFilter = Filter.newBuilder() .setCompositeFilter(CompositeFilter.newBuilder().addFilters(filter1).addFilters(filter2).build()).build();

这里的Filter1 和Filter2 是您创建的过滤器。我的 IDE 允许我这样做(我使用的是 IntelliJ IDEA,最新版本)。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多