如何在Google Cloud Datastore中获取一种实体的总数

时间:2019-07-14 21:54:05

标签: java google-cloud-platform google-cloud-datastore

我在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

2 个答案:

答案 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,以使您知道它已完成