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

slmsl1lt  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(107)

我有一种在Google Cloud Datastore中拥有大约500万个实体的类型。我想用Java编程获得这个计数。我尝试了下面的代码,但它的工作达到一定的阈值(800K)。当我运行查询5M记录时,它进入无限循环(我猜),因为它不返回任何计数。如何获取这些大数据的实体数量?我不想使用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
r6vfmomb

r6vfmomb1#

你需要多精确的计数?对于稍微过时的计数,您可以使用stats entity来获取某个种类的实体数量。
如果你不能使用stats实体中的过时计数,那么你需要保留计数器实体来进行你需要的真实的计数。您应该考虑使用sharded counter

nqwrtyyt

nqwrtyyt2#

查看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,让您知道它已经完成了

yrwegjxp

yrwegjxp3#

COUNT aggregation in datastore现在通常可用。
有多种语言的客户端库支持此特定功能。
使用此功能,用户可以避免执行客户端聚合,这增加了出口成本的额外负担。也不需要使用像云函数这样的替代方案来更新后端的聚合值,这本身是一个成本限制。

相关问题