Я новичок в DynamoDB, и у меня есть локальный экземпляр внутри JVM, но когда я пытаюсь создать индекс, определенный как
GlobalSecondaryIndexUpdate stockIndex = new GlobalSecondaryIndexUpdate()
.withCreate(new CreateGlobalSecondaryIndexAction()
.withIndexName("StockIndex")
.withKeySchema(new KeySchemaElement().withAttributeName("stock").withKeyType(KeyType.RANGE), // Partition key
new KeySchemaElement().withAttributeName("date").withKeyType(KeyType.RANGE)) // Compound key?
.withProjection(new Projection().withProjectionType(projectionType)));
Я получаю неизвестный внутренний сбой, например:
Caused by: com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: The request processing has failed because of an unknown error, exception or failure. (Service: AmazonDynamoDBv2; Status Code: 500; Error Code: InternalFailure; Request ID: dccfbf27-2e33-463c-b36e-97a432f4cd6b)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1588)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1258)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1030)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:742)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:716)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:2089)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:2065)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeUpdateTable(AmazonDynamoDBClient.java:1921)
при попытке создать GSI. Я неправильно определяю индекс или это не поддерживается в DynamoDB Local?
Обновление 2018-07-30:
Я тестировал:
// StockIndex
GlobalSecondaryIndexUpdate stockIndex = new GlobalSecondaryIndexUpdate()
.withCreate(new CreateGlobalSecondaryIndexAction()
.withIndexName("StockIndex")
.withKeySchema(
new KeySchemaElement().withAttributeName("stock").withKeyType(KeyType.HASH)) // Partition key
new KeySchemaElement().withAttributeName("date").withKeyType(KeyType.RANGE)) // Compound key?
.withProjection(new Projection().withProjectionType(ProjectionType.ALL)));
а также без клавиши RANGE на date, но оба раза у меня был один и тот же расплывчатый InternalFailure. Я подозреваю, что GSI просто не поддерживаются локальным экземпляром DynamoDB (хотя в Примечания по использованию вторичные индексы вообще не упоминаются)




Это возможно. Я предполагаю, что ошибка, которую вы получаете, вызвана тем, что у вас
.withKeyType(KeyType.RANGE)
указано дважды. Только 1 атрибут может быть ключом диапазона / сортировки, другой должен быть ключом хеширования.
Оказывается, было две проблемы: (1) отсутствие ключа HASH / раздела и (2) я не указывал явную «предоставленную пропускную способность». Следующий код работал:
CreateGlobalSecondaryIndexAction stockIndex = new CreateGlobalSecondaryIndexAction()
.withIndexName("StockIndex")
.withKeySchema(
new KeySchemaElement().withAttributeName("stock").withKeyType(KeyType.HASH), // Partition key
new KeySchemaElement().withAttributeName("date").withKeyType(KeyType.RANGE)) // Sort key
.withProvisionedThroughput(new ProvisionedThroughput(20L, 20L))
.withProjection(new Projection().withProjectionType(ProjectionType.KEYS_ONLY));
Обратите внимание на вызов withProvisionedThroughput.