使用PHP在AWS DynamoDB中使用JOIN查询


Using JOIN query in AWS DynamoDB using PHP

我目前正在使用MySQL作为PHP应用程序的数据库。但现在需要迁移到AWS DynamoDB。由于我是DynamoDB的新手,有人能帮助我在DynamoDB中使用JOIN吗?

根据我的发现,我发现JOIN可以使用Hive和Amazon EMR。但这里也存在一个问题,即没有可用的资源与PHP一起使用Hive。

嗨,也许你可以试试这个

加入两个DynamoDB表在集群上计算联接并返回。联接不会在DynamoDB中进行。此示例为下了两个以上订单的客户返回客户及其购买的物品的列表。

CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
"dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");
CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Customers",
"dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address");
Select c.customerId, c.customerName, count(*) as count from hive_customers c 
JOIN hive_purchases p ON c.customerId=p.customerId 
GROUP BY c.customerId, c.customerName HAVING count > 2;

连接来自不同来源的两个表

在下面的示例中,Customer_S3是一个Hive表,它加载存储在AmazonS3中的CSV文件,而Hive_purchases是一个引用DynamoDB中数据的表。以下示例将存储在AmazonS3中的CSV文件中的客户数据与存储在DynamoDB中的订单数据连接在一起,以返回一组数据,这些数据表示名称中有"Miller"的客户下的订单。

创建外部表hive_purchases(customerId bigint、total_cost double、items_purchased数组)由"org.apache.hadop.hive.dynamodb.DynmoDBStorageHandler"存储TBLPROPERTIES("发电机db.table.name"="采购","generanddb.column.mapping"="customerId:customerId,total_cost:Cast,items_purchase:items");

CREATE EXTERNAL TABLE Customer_S3(customerId bigint, customerName string, customerAddress array<String>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION 's3://bucketname/path/subpath/';
Select c.customerId, c.customerName, c.customerAddress from 
Customer_S3 c 
JOIN hive_purchases p 
ON c.customerid=p.customerid 
where c.customerName like '%Miller%';

有关详细信息,您可以阅读文档DynamoDB导出、导入查询

祝你好运,试试

好吧,将sql迁移到NoSQL是一个艰难的决定,您可能想看看这个白色页面,看看您的应用程序是否能够在NoSQL世界中生存。

您这样做是为了数据迁移吗?还是为您的应用程序?

你有一个你试图加入的数据的例子吗?SQL和NoSQL数据库之间的数据建模差异很大,因此正如@AndrewTempleton所说,您可能需要对数据进行反规范化。使用DynamoDB建模的关键之一是了解数据的访问模式。将此与数据的逻辑结构结合起来,就可以开始对其进行有效建模。

如果是针对您的应用程序,您可以创建一个表,并将已联接的表嵌套在父表中,因此无需联接任何内容。

如果您继续有两个表,那么就没有引用完整性,除非您自己构建它。如果您想连接这两个表,您需要通过编程来实现这一点——父级的GetItem调用的外循环(或BatchGetItem)和子级的GetItem调用的内循环。

或者,您可以保留这两个表,并使用DynamoDB流,构建这两个表格的非规范化"视图"。需要考虑一些关于一致性的考虑。

因此,本质上,DynamoDB中的联接只是几个循环。这是非常不同的想法。

如果你想继续在RDBMS的世界,你有没有考虑过RDS for MySQL。