【问题标题】:Subquery in dynamodbdynamodb 中的子查询
【发布时间】:2017-10-24 06:02:52
【问题描述】:

我在 MySQL 中有一个名为 OrderDetails 的表,如下所示。

Delivered   |OrderID    |ProductID  |Quantity
true        |10001      |11         |12
true        |10002      |10         |10
true        |10002      |11         |5
false       |10002      |12         |9
true        |10002      |13         |40
true        |10003      |10         |10
true        |10003      |11         |35
true        |10003      |12         |15
false       |10004      |10         |6
false       |10004      |11         |15
true        |10004      |12         |20
false       |10005      |10         |40
false       |10005      |11         |25
true        |10005      |12         |40
false       |10005      |13         |20

我可以得到一个产品的最高订单,然后使用以下查询通过它的交货状态进一步过滤它。

SELECT * FROM (SELECT MAX(Quantity) as MaxQuantity, ProductID, OrderID, Delivered FROM OrderDetails GROUP BY ProductID) as t WHERE t.Delivered = true;

Delivered   |OrderID    |ProductID  |Quantity
true        |10250      |11         |35
true        |10252      |12         |40
true        |10249      |13         |40

我想在 dynamodb 中也一样。我创建了使用 ProductID 作为主(分区键)和 Quantity 作为排序键的表。我相信数据会存储如下。

Delivered   |OrderID    |ProductID  |Quantity
false       |10252      |10         |40
false       |10248      |10         |10
true        |10250      |10         |10
false       |10251      |10         |6
true        |10250      |11         |35
false       |10252      |11         |25
false       |10251      |11         |15
true        |10247      |11         |12
true        |10248      |11         |5
true        |10252      |12         |40
true        |10251      |12         |20
true        |10250      |12         |15
false       |10249      |12         |9
true        |10249      |13         |40
false       |10253      |13         |20

现在我想在 dynamodb 中进行相同类型的查询。我不知道该怎么做。

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    您可以使用 Hive 在 dynamodb 上执行相同的查询。为此:

    1. 在 aws 控制台中转至 emr 并启动集群。
    2. 连接到主节点并输入“hive”。
    3. 在 hive 中,创建一个链接到您的 dynamodb 表的外部表。

      CREATE EXTERNAL TABLE OrderDetails (Delivered boolean , OrderID bigint , ProductID bigint , Quantity bigint) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "OrderDetails" , "dynamodb.column.mapping" = "Delivered:Delivered , OrderID:OrderID , ProductID:ProductID , Quantity:Quantity");

    4. 在 hive 中执行您的查询。

      SELECT * FROM (SELECT MAX(Quantity) as MaxQuantity, ProductID, OrderID, Delivered FROM OrderDetails GROUP BY ProductID) t WHERE t.Delivered = true;

    【讨论】:

    • 这行得通。但是hive 没有达到我们预期的性能。
    • 我不知道您期望什么性能或您的用例。您可能会考虑您想要执行的查询需要在 dynamodb 中进行扫描,因此如果您想将此查询用于在几毫秒内提供响应的 Web 应用程序,那么 dynamodb 可能不是这种方式的最佳选择。跨度>
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多