从 Google 数据流保存到 Google 数据存储
Saving to Google Datastore from Google Dataflow
我正在尝试从 Google 数据流作业保存到 Google 数据存储,它给我这个错误
我在 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
不是 public 方法。提交了一个问题 here。
目前您可以自己实施此 method。
遇到了同样的问题,所以认为出路也可能对其他人有所帮助。
我有 google-cloud-datastore
(版本 0.11.2-beta
)作为我的依赖项,它产生了 datastore-v1-protos-1.0.1
。我相信上述问题的根本原因是这个库特定 class 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/Name 那么您可以直接创建密钥并检查它是否存在于数据存储中。
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);
}
我正在尝试从 Google 数据流作业保存到 Google 数据存储,它给我这个错误
我在 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
不是 public 方法。提交了一个问题 here。
目前您可以自己实施此 method。
遇到了同样的问题,所以认为出路也可能对其他人有所帮助。
我有 google-cloud-datastore
(版本 0.11.2-beta
)作为我的依赖项,它产生了 datastore-v1-protos-1.0.1
。我相信上述问题的根本原因是这个库特定 class 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/Name 那么您可以直接创建密钥并检查它是否存在于数据存储中。
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);
}