我在Google Cloud Datastore中拥有大约500万个实体。我想使用Java以编程方式获取此计数。我尝试了以下代码,但它可以达到一定的阈值(800K)。 当我查询500万条记录时,由于不返回任何计数,它进入了无限循环(我的猜测)。如何获取此大数据的实体数?我不想使用Google App Engine API,因为它需要设置环境。
private static Datastore datastore;
datastore = DatastoreOptions.getDefaultInstance().getService();
Query query = Query.newKeyQueryBuilder().setKind(kind).build();
int count = Iterators.size(datastore.run(query)); //count has the entities count
答案 0 :(得分:1)
您需要多精确的计数?对于稍微过时的计数,您可以使用stats entity来获取一种实体的数量。
如果您不能使用stats实体中的过时计数,则需要保留计数器实体以获得所需的实时计数。您应该考虑使用sharded counter。
答案 1 :(得分:0)
检出Google Dataflow。像下面这样的管道应该做到这一点:
def send_count_to_call_back(callback_url):
def f(record_count):
r = requests.post(callback_url, data=json.dumps({
'record_count': record_count,
}))
return f
def run_pipeline(project, callback_url)
pipeline_options = PipelineOptions.from_dictionary({
'project': project,
'runner': 'DataflowRunner',
'staging_location':'gs://%s.appspot.com/dataflow-data/staging' % project,
'temp_location':'gs://%s.appspot.com/dataflow-data/temp' % project,
# .... other options
})
query = query_pb2.Query()
query.kind.add().name = 'YOUR_KIND_NAME_GOES HERE'
p = beam.Pipeline(options=pipeline_options)
_ = (p
| 'fetch all rows for query' >> ReadFromDatastore(project, query)
| 'count rows' >> apache_beam.combiners.Count.Globally()
| 'send count to callback' >> apache_beam.Map(send_count_to_call_back(callback_url))
)
我使用python,但是它们也有Java sdk https://beam.apache.org/documentation/programming-guide/
唯一的问题是您的进程将必须触发此管道,让它自己运行几分钟,然后让其命中一个回调URL,以使您知道它已完成