从Google DataFlow保存到Google数据存储



我试图从Google DataFlow作业中保存到Google DataStore,这给了我这个错误

我的代码在dofn中是

Datastore datastore= DatastoreOptions.getDefaultInstance().getService();
        TrackingRequest rq = gson.fromJson(c.element().toString(), TrackingRequest.class);
        Query<Entity> query = Query.entityQueryBuilder().kind("Post").filter(PropertyFilter.eq("postid", rq.postid))
                .build();
        QueryResults<Entity> posts = datastore.run(query);
        if (posts == null || !posts.hasNext()) {
            KeyFactory keyFactory = datastore.newKeyFactory().setKind("Post");
            Key key = keyFactory.newKey(rq.postid);
            Entity entity = Entity.newBuilder(key)
                    .set("appid", rq.appid)
                    .set("postid", rq.postid)
                    .set("title", rq.title)                 
                    .build();               

            datastore.put(entity);
            // c.output(((FullEntity<IncompleteKey>)entity).toPb());
        }

错误是:

exception: "java.lang.NoSuchMethodError: com.google.datastore.v1.Entity$Builder.putProperties(Ljava/lang/String;Lcom/google/datastore/v1/Value;)Lcom/google/datastore/v1/Entity$Builder;
at com.google.cloud.datastore.BaseEntity.toPb(BaseEntity.java:683)
at com.google.cloud.datastore.DatastoreImpl.put(DatastoreImpl.java:337)
at com.google.cloud.datastore.DatastoreHelper.put(DatastoreHelper.java:55)
at com.google.cloud.datastore.DatastoreImpl.put(DatastoreImpl.java:315)
at com.kryptonz.proccess.KryptonzArchive$RawToObjectConverter.processElement(KryptonzArchive.java:80)
at com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49)
at 

看起来toPb不是公共方法。在这里提出了一个问题。

暂时您可以自己实现此方法。

面临同一问题,因此认为出路也可能会帮助他人。

我将google-cloud-datastore0.11.2-beta版本)作为我的依赖性,它带有datastore-v1-protos-1.0.1。我相信上述问题的根本原因是该液体特定类com.google.datastore.v1.Entity.Builder,它不支持putProperties也不支持getPropertiesMap

以更好的方式了解问题陈述,帮助我对问题进行了常规分类。我只需要确保获得datastore-v1-protos的新依赖性,该依赖性支持那些缺少API的人。因此,在我的pom.xml

中添加了以下依赖关系
    <dependency>
        <groupId>com.google.cloud.datastore</groupId>
        <artifactId>datastore-v1-protos</artifactId>
        <version>1.3.0</version>
    </dependency>

此更改可能会产生一些Protobuf回归,因此在您的pom.xml中包括以下依赖性,以避免使用。

    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.2.0</version>
    </dependency>

在pom.xml和您导入的库中检查数据存储的依赖。

<dependency>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-datastore</artifactId>
     <version>1.90.0<</version>
  </dependency>
 import com.google.cloud.datastore.Entity;
 import com.google.cloud.datastore.Key;

以及如果req.post ID是数据存储实体中的ID/名称,则可以直接创建键并检查它是否存在于数据存储中。

Datastore datastore =
  Datastore datastore= DatastoreOptions.getDefaultInstance().getService();
  Key key = datastore.newKeyFactory().setKind("Post").newKey(rq.postid);
  if(key == null){
        Entity entity = Entity.newBuilder(key)
                .set("appid", rq.appid)
                .set("postid", rq.postid)
                .set("title", rq.title)                 
                .build();   
          datastore.put(entity);   
  }

最新更新