2015-11-05 73 views
0

我在Amazon DynamoDB中有两个表:元素和容器。层次结构是一个容器可以容纳很少的元素。
所以元素看起来像:uuid,timestamp,container_id,data。
我想要聚合的所有元素的数据到对应的容器,例如:
元素:如何将数据复制到另一个表而不覆盖现有列

| uuid | container_id | data | 
| 1 | 1   | 100 | 
| 2 | 1   | 150 | 
| 3 | 2   | 100 | 

所以我想在集装箱表获得:

| uuid | data | 
| 1 | 250 | 
| 2 | 100 | 

因此,使用蜂巢,我写脚本(在EMR集群上启动):

CREATE EXTERNAL TABLE element (`uuid` string, `container_id ` bigint, `data` double) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES("dynamodb.table.name"="Elements", "dynamodb.column.mapping"="uuid:UUID,container_id:container_id,data:data"); 
CREATE EXTERNAL TABLE container (`uuid` string, `data` double) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES("dynamodb.table.name"="Containers", "dynamodb.column.mapping"="uuid:UUID,data:data"); 
INSERT INTO TABLE container SELECT container_id as `uuid` sum(`data`) as `data` FROM element WHERE container_id IS NOT NULL GROUP BY container_id; 

它运作良好,但现在我需要写e Containers表的一些额外数据,所以它应该像uuid, data, another_data。但是,当我在上面执行脚本时,它将覆盖所有another_data(未在外部表中列出)。我尝试了很多变体,但找不到解决方案。

+0

当你到容器的表什么样的价值增加额外的列不出此列采取现有的数据? – madhu

+0

添加新数据不是高性能操作,所以我通过java和'amazonDynamoDBClient.updateItem(tableName,key,attributeUpdates)'来实现,它实际上会放入一些数据,而不会影响其他数据。 –

回答

0

好吧,我找到了答案:

CREATE EXTERNAL TABLE element (`uuid` string, `container_id ` bigint, `data` double) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES("dynamodb.table.name"="Elements", "dynamodb.column.mapping"="uuid:UUID,container_id:container_id,data:data"); 
CREATE EXTERNAL TABLE container (`uuid` string, `data` double, `another_data` double) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES("dynamodb.table.name"="Containers", "dynamodb.column.mapping"="uuid:UUID,data:data,another_data:another_data"); 
INSERT INTO TABLE container SELECT element.`container_id` as `uuid` sum(element.`data`) as `data`, collect_set(container.`another_data`)[0] as `another_data` FROM element LEFT JOIN container ON (element.`container_id` = container.`uuid`) WHERE element.container_id IS NOT NULL GROUP BY element.container_id; 
相关问题