我目前正在使用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。