2015-11-05 4 views
0

У меня есть 2 таблицы в моем 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 некоторые дополнительные данные в таблицу контейнеров, поэтому это должно быть как 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; 
Смежные вопросы