Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取DynamoDB表中的项目总数?_Php_Amazon Dynamodb - Fatal编程技术网

Php 如何获取DynamoDB表中的项目总数?

Php 如何获取DynamoDB表中的项目总数?,php,amazon-dynamodb,Php,Amazon Dynamodb,我想知道我的dynamodb表中有多少项。从API指南中,一种方法是使用如下所示的: <?php $dynamodb = new AmazonDynamoDB(); $scan_response = $dynamodb->scan(array( 'TableName' => 'ProductCatalog' )); echo "Total number of items: ".count($scan_response->body->Items)."\n

我想知道我的dynamodb表中有多少项。从API指南中,一种方法是使用如下所示的:

<?php
$dynamodb = new AmazonDynamoDB();

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
));

echo "Total number of items: ".count($scan_response->body->Items)."\n";

Aha,在
scan
API中有一个
Count
选项,请参阅


计数选项绝对是您想要的,但您还必须考虑到扫描结果中可能有一页或多页结果。扫描操作一次只扫描表中1MB的数据,因此结果中的
Count
值只会反映表中前1MB的计数。您需要使用结果中的
LastEvaluatedKey
值(如果有)进行后续请求。下面是一些执行类似操作的示例代码:

<?php

$dynamo_db = new AmazonDynamoDB();

$total = 0;
$start_key = null;
$params = array(
    'TableName' => 'my-table',
    'Count'     => true
);

do {
    if ($start_key) {
        $params['ExclusiveStartKey'] = $start_key->getArrayCopy();
    }

    $response = $dynamo_db->scan($params);

    if ($response->isOK()) {
        $total += (string) $response->body->Count;

        if ($response->body->LastEvaluatedKey) {
            $start_key = $response->body->LastEvaluatedKey->to_array();
        } else {
            $start_key = null;
        }
    }
} while ($start_key);

echo "Count: {$total}";

DynamoDB的AWS控制台中提供了一个大致的项目计数值(假定每六小时更新一次)。只需选择该表并查看“详细信息”选项卡下的最后一个条目是Item Count。如果这对您有效,那么您可以避免使用表吞吐量进行计数。

如果您有兴趣在应用程序的逻辑中使用表中的项目总数,这意味着您将非常频繁地查询总计数。现在实现这一点的一种方法是使用扫描操作。但请记住,扫描操作实际上是扫描整个表,因此会消耗大量吞吐量,因此所有查询操作都会在该持续时间内收到限制异常。即使考虑到扫描会将结果计数限制在1MB的大小,如果表非常大,您也必须重复扫描操作以获得实际的项目数。这将需要编写自定义查询逻辑并处理查询操作中不可避免的节流

我想到的一个更好的解决方案是在一个单独的表中维护这些表的项目总数,其中每个项目都将表名作为其哈希键,表中的项目总数作为其非键属性。然后,您可以通过执行原子更新操作来增加/减少特定表的项目总数,从而使该表可能名为“TotalNumberOfItemsPerTable”进行更新

没有节流或1MB限制的问题


此外,您还可以将此概念扩展到更高的粒度,例如,维护与某个哈希键或任意条件匹配的项目总数,您可以将其编码为字符串形式,以便在表中创建一个名为“TotalNumberOfItemsInSomeCollection”或“TotalNumberOfItemsMatchingSomeCriteria”的条目。然后,这些表可以包含每个表、每个集合或与某些条件匹配的项目数的条目。

我可以想出三个选项来获取DynamoDB表中的项目总数

  • 第一个选项是使用扫描,但扫描功能效率低下,通常是一种不好的做法,尤其是对于具有大量读取的表或生产表

  • 第二种选择是Atharva提到的:

    我想到的一个更好的解决办法是保持总量 单独表格中此类表格的项目计数数,其中 项目将具有表名作为其哈希键和项目总数 在该表中,因为它是非键属性。然后你可以保留这张桌子 可能命名为“TotalNumberOfItemsPerTable”,通过使原子 update operations以递增/递减项目的总计数 特殊表格

    唯一的问题是增量运算不是幂等的。因此,如果一次写入失败或多次写入,这将反映在计数中。如果需要接点精度,请改用条件更新

  • 最简单的解决方案是返回ItemCount的descripbetable。唯一的问题是计数不是最新的。计数每6小时更新一次


  • 这现在可在AWS表格概览屏幕的“表格详细信息”部分的“项目计数”字段中找到。它似乎只是一堆可描述的内容,并注意到它大约每六个小时更新一次

    下面是我如何在我的十亿条记录DynamoDB表中获得准确的项目数:

    蜂巢>

    *您应该有一个EMR集群,它随Hive和DynamoDB记录处理程序一起安装。 *有了这个命令,配置单元上的DynamoDB处理程序将与多个Mapreduce映射器(也称为Workers)在不同分区上进行“并行扫描”,以获取计数。这将比普通扫描效率更高、速度更快。
    *您必须愿意在一定时间内将读取容量提高到非常高的水平。 *在一个相当大(20节点)的集群上,有10000个RCU,大约需要15分钟才能获得十亿条记录。

    *在此期间在此DDB表上的新写入操作将导致计数不一致

    请不要使用dynamoDb的扫描方法,因为它读取了tabel的所有数据,但在这种情况下,您只需要计数,所以请使用此方法

    $scan_response = $dynamodb->describeTable(array(
    'TableName' => 'ProductCatalog' ));
    

    并将此打印出来作为结果
    $scan\u response['Table']['ItemCount']

    ,正如Jeremy Lindblom在他的回答中所提到的,并由此证明:确保您注意1MB限制,即如果表大小大于1MB,返回的计数可能是部分计数。每当我运行上述代码时,我得到以下信息:
    致命错误:在C:\Users\Lenovo\xampp\public\u html\upload\u file.php的第73行中找不到类“DynamoMetadata”
    。如何解决此问题?在此处使用可描述的详细信息:这不是最好的方法,因为计数可能不是最新的,它每6小时更新一次。
    TransactionWriteItems
    API是否可以用于创建原子操作,将其放入主表并同时更新TotalNumberOfItemsPerTable表?
    set dynamodb.throughput.write.percent = 1;
    set dynamodb.throughput.read.percent = 1;
    set hive.execution.engine = mr;
    set mapreduce.reduce.speculative=false;
    set mapreduce.map.speculative=false;
    
    CREATE EXTERNAL TABLE dynamodb_table (`ID` STRING,`DateTime` STRING,`ReportedbyName` STRING,`ReportedbySurName` STRING,`Company` STRING,`Position` STRING,`Country` STRING,`MailDomain` STRING) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "BillionData", "dynamodb.column.mapping" = "ID:ID,DateTime:DateTime,ReportedbyName:ReportedbyName,ReportedbySurName:ReportedbySurName,Company:Company,Position:Position,Country:Country,MailDomain:MailDomain");
    
    SELECT count(*) FROM dynamodb_table;
    
    $scan_response = $dynamodb->describeTable(array(
    'TableName' => 'ProductCatalog' ));