Есть ли способ получить имя атрибута HashKey таблицы Dynamodb в Java?

e.g., if the dyanmodb table schema is 
(
 "HashKey, String", SSNId
 "SortKey, Long", Pincode
 "String", Name 
)
So I should be able to get the output like this:-
getHashKeyAttributeName(String tableName) --> SSNId
getSortkeyAttributeName(String tableName) --> Pincode
getOtherAttributeList(String tableName) --> Name
1
Kartik Goyal 24 Июн 2017 в 04:06

1 ответ

Лучший ответ

Вам просто нужно перебрать keySchemas и attributeDefinitions при описании таблицы.

DynamodbTable описание имеет следующую структуру, (я использую clojure-aws < / a>, вы можете использовать aws cli для см. структуру таблицы)

user=> (db/describe-table {:profile "aws-profile" :endpoint "us-west-2"} "KeyValueLookupTable1")
{:table {:key-schema [{:key-type "HASH", :attribute-name "leaseKey"}], :table-size-bytes 201, :attribute-definitions [{:attribute-name "leaseKey", :attribute-type "S"}], :creation-date-time #object[org.joda.time.DateTime 0x4c6ece3 "2017-06-07T15:50:35.057-07:00"], :item-count 1, :table-status "ACTIVE", :table-name "KeyValueLookupTable1", :provisioned-throughput {:read-capacity-units 10, :write-capacity-units 10, :number-of-decreases-today 0}, :table-arn "arn:aws:dynamodb:us-west-2:033814027302:table/KeyValueLookupTable1"}}

Где вы можете увидеть ключи key-schema и attribute-definitions, по которым вам нужно будет выполнить итерацию.

1) См. документацию для TableDescription#getKeySchema, чтобы получить ключи HASH и RANGE.

Пример с java8

  DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient())

  String getHashKeyAttributeName(String tableName) {

    TableDescription tableSchema = dynamoDB.getTable(tableName).describe();

    return tableSchema.getKeySchema().stream()
            .filter(x -> x.getKeyType().equals(KeyType.HASH.toString()))
            .findFirst().get().getAttributeName();        
  }

  String getSortkeyAttributeName(String tableName) {

    TableDescription tableSchema = dynamoDB.getTable(tableName).describe();

    return tableSchema.getKeySchema().stream()
            .filter(x -> x.getKeyType().equals(KeyType.RANGE.toString()))
            .findFirst().get().getAttributeName();
  }

2) Для других полей вам необходимо выполнить итерацию по List<AttributeDefinitions>, который вы получаете на tableDescription.getAttributeDefinitions

List<String> getOtherAttributeList(String tableName) {

    DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
    TableDescription tableSchema = dynamoDB.getTable(tableName).describe();

    return tableSchema.getAttributeDefinitions().stream()
            .map(AttributeDefinition::getAttributeName)
            .collect(Collectors.toList());
}
2
prayagupd 24 Июн 2017 в 08:05