The following Java code example creates tables and uploads data to the tables. For step-by-step instructions to run this code using Eclipse, see Java code examples.
package com.amazonaws.codesamples;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.TimeZone;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.LocalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.Projection;
import com.amazonaws.services.dynamodbv2.model.ProjectionType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
public class CreateTablesLoadData {
static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
static DynamoDB dynamoDB = new DynamoDB(client);
static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
static String productCatalogTableName = "ProductCatalog";
static String forumTableName = "Forum";
static String threadTableName = "Thread";
static String replyTableName = "Reply";
public static void main(String[] args) throws Exception {
try {
deleteTable(productCatalogTableName);
deleteTable(forumTableName);
deleteTable(threadTableName);
deleteTable(replyTableName);
// Parameter1: table name
// Parameter2: reads per second
// Parameter3: writes per second
// Parameter4/5: partition key and data type
// Parameter6/7: sort key and data type (if applicable)
createTable(productCatalogTableName, 10L, 5L, "Id", "N");
createTable(forumTableName, 10L, 5L, "Name", "S");
createTable(threadTableName, 10L, 5L, "ForumName", "S", "Subject", "S");
createTable(replyTableName, 10L, 5L, "Id", "S", "ReplyDateTime", "S");
loadSampleProducts(productCatalogTableName);
loadSampleForums(forumTableName);
loadSampleThreads(threadTableName);
loadSampleReplies(replyTableName);
} catch (Exception e) {
System.err.println("Program failed:");
System.err.println(e.getMessage());
}
System.out.println("Success.");
}
private static void deleteTable(String tableName) {
Table table = dynamoDB.getTable(tableName);
try {
System.out.println("Issuing DeleteTable request for " + tableName);
table.delete();
System.out.println("Waiting for " + tableName + " to be deleted...this may take a while...");
table.waitForDelete();
} catch (Exception e) {
System.err.println("DeleteTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}
private static void createTable(String tableName, long readCapacityUnits, long writeCapacityUnits,
String partitionKeyName, String partitionKeyType) {
createTable(tableName, readCapacityUnits, writeCapacityUnits, partitionKeyName, partitionKeyType, null, null);
}
private static void createTable(String tableName, long readCapacityUnits, long writeCapacityUnits,
String partitionKeyName, String partitionKeyType, String sortKeyName, String sortKeyType) {
try {
ArrayList<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();
keySchema.add(new KeySchemaElement().withAttributeName(partitionKeyName).withKeyType(KeyType.HASH)); // Partition
// key
ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>();
attributeDefinitions
.add(new AttributeDefinition().withAttributeName(partitionKeyName)
.withAttributeType(partitionKeyType));
if (sortKeyName != null) {
keySchema.add(new KeySchemaElement().withAttributeName(sortKeyName).withKeyType(KeyType.RANGE)); // Sort
// key
attributeDefinitions
.add(new AttributeDefinition().withAttributeName(sortKeyName).withAttributeType(sortKeyType));
}
CreateTableRequest request = new CreateTableRequest().withTableName(tableName).withKeySchema(keySchema)
.withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(readCapacityUnits)
.withWriteCapacityUnits(writeCapacityUnits));
// If this is the Reply table, define a local secondary index
if (replyTableName.equals(tableName)) {
attributeDefinitions
.add(new AttributeDefinition().withAttributeName("PostedBy").withAttributeType("S"));
ArrayList<LocalSecondaryIndex> localSecondaryIndexes = new ArrayList<LocalSecondaryIndex>();
localSecondaryIndexes.add(new LocalSecondaryIndex().withIndexName("PostedBy-Index")
.withKeySchema(
new KeySchemaElement().withAttributeName(partitionKeyName).withKeyType(KeyType.HASH), // Partition
// key
new KeySchemaElement().withAttributeName("PostedBy").withKeyType(KeyType.RANGE)) // Sort
// key
.withProjection(new Projection().withProjectionType(ProjectionType.KEYS_ONLY)));
request.setLocalSecondaryIndexes(localSecondaryIndexes);
}
request.setAttributeDefinitions(attributeDefinitions);
System.out.println("Issuing CreateTable request for " + tableName);
Table table = dynamoDB.createTable(request);
System.out.println("Waiting for " + tableName + " to be created...this may take a while...");
table.waitForActive();
} catch (Exception e) {
System.err.println("CreateTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}
private static void loadSampleProducts(String tableName) {
Table table = dynamoDB.getTable(tableName);
try {
System.out.println("Adding data to " + tableName);
Item item = new Item().withPrimaryKey("Id", 101).withString("Title", "Book 101 Title")
.withString("ISBN", "111-1111111111")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author1"))).withNumber("Price", 2)
.withString("Dimensions", "8.5 x 11.0 x 0.5").withNumber("PageCount", 500)
.withBoolean("InPublication", true).withString("ProductCategory", "Book");
table.putItem(item);
item = new Item().withPrimaryKey("Id", 102).withString("Title", "Book 102 Title")
.withString("ISBN", "222-2222222222")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author1", "Author2")))
.withNumber("Price", 20).withString("Dimensions", "8.5 x 11.0 x 0.8").withNumber("PageCount", 600)
.withBoolean("InPublication", true).withString("ProductCategory", "Book");
table.putItem(item);
item = new Item().withPrimaryKey("Id", 103).withString("Title", "Book 103 Title")
.withString("ISBN", "333-3333333333")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author1", "Author2")))
// Intentional. Later we'll run Scan to find price error. Find
// items > 1000 in price.
.withNumber("Price", 2000).withString("Dimensions", "8.5 x 11.0 x 1.5").withNumber("PageCount", 600)
.withBoolean("InPublication", false).withString("ProductCategory", "Book");
table.putItem(item);
// Add bikes.
item = new Item().withPrimaryKey("Id", 201).withString("Title", "18-Bike-201")
// Size, followed by some title.
.withString("Description", "201 Description").withString("BicycleType", "Road")
.withString("Brand", "Mountain A")
// Trek, Specialized.
.withNumber("Price", 100).withStringSet("Color", new HashSet<String>(Arrays.asList("Red", "Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);
item = new Item().withPrimaryKey("Id", 202).withString("Title", "21-Bike-202")
.withString("Description", "202 Description").withString("BicycleType", "Road")
.withString("Brand", "Brand-Company A").withNumber("Price", 200)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Green", "Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);
item = new Item().withPrimaryKey("Id", 203).withString("Title", "19-Bike-203")
.withString("Description", "203 Description").withString("BicycleType", "Road")
.withString("Brand", "Brand-Company B").withNumber("Price", 300)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red", "Green", "Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);
item = new Item().withPrimaryKey("Id", 204).withString("Title", "18-Bike-204")
.withString("Description", "204 Description").withString("BicycleType", "Mountain")
.withString("Brand", "Brand-Company B").withNumber("Price", 400)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);
item = new Item().withPrimaryKey("Id", 205).withString("Title", "20-Bike-205")
.withString("Description", "205 Description").withString("BicycleType", "Hybrid")
.withString("Brand", "Brand-Company C").withNumber("Price", 500)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red", "Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);
} catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}
private static void loadSampleForums(String tableName) {
Table table = dynamoDB.getTable(tableName);
try {
System.out.println("Adding data to " + tableName);
Item item = new Item().withPrimaryKey("Name", "Amazon DynamoDB")
.withString("Category", "Amazon Web Services").withNumber("Threads", 2).withNumber("Messages", 4)
.withNumber("Views", 1000);
table.putItem(item);
item = new Item().withPrimaryKey("Name", "Amazon S3").withString("Category", "Amazon Web Services")
.withNumber("Threads", 0);
table.putItem(item);
} catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}
private static void loadSampleThreads(String tableName) {
try {
long time1 = (new Date()).getTime() - (7 * 24 * 60 * 60 * 1000); // 7
// days
// ago
long time2 = (new Date()).getTime() - (14 * 24 * 60 * 60 * 1000); // 14
// days
// ago
long time3 = (new Date()).getTime() - (21 * 24 * 60 * 60 * 1000); // 21
// days
// ago
Date date1 = new Date();
date1.setTime(time1);
Date date2 = new Date();
date2.setTime(time2);
Date date3 = new Date();
date3.setTime(time3);
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Table table = dynamoDB.getTable(tableName);
System.out.println("Adding data to " + tableName);
Item item = new Item().withPrimaryKey("ForumName", "Amazon DynamoDB")
.withString("Subject", "DynamoDB Thread 1").withString("Message", "DynamoDB thread 1 message")
.withString("LastPostedBy", "User A").withString("LastPostedDateTime", dateFormatter.format(date2))
.withNumber("Views", 0).withNumber("Replies", 0).withNumber("Answered", 0)
.withStringSet("Tags", new HashSet<String>(Arrays.asList("index", "primarykey", "table")));
table.putItem(item);
item = new Item().withPrimaryKey("ForumName", "Amazon DynamoDB").withString("Subject", "DynamoDB Thread 2")
.withString("Message", "DynamoDB thread 2 message").withString("LastPostedBy", "User A")
.withString("LastPostedDateTime", dateFormatter.format(date3)).withNumber("Views", 0)
.withNumber("Replies", 0).withNumber("Answered", 0)
.withStringSet("Tags", new HashSet<String>(Arrays.asList("index", "partitionkey", "sortkey")));
table.putItem(item);
item = new Item().withPrimaryKey("ForumName", "Amazon S3").withString("Subject", "S3 Thread 1")
.withString("Message", "S3 Thread 3 message").withString("LastPostedBy", "User A")
.withString("LastPostedDateTime", dateFormatter.format(date1)).withNumber("Views", 0)
.withNumber("Replies", 0).withNumber("Answered", 0)
.withStringSet("Tags", new HashSet<String>(Arrays.asList("largeobjects", "multipart upload")));
table.putItem(item);
} catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}
private static void loadSampleReplies(String tableName) {
try {
// 1 day ago
long time0 = (new Date()).getTime() - (1 * 24 * 60 * 60 * 1000);
// 7 days ago
long time1 = (new Date()).getTime() - (7 * 24 * 60 * 60 * 1000);
// 14 days ago
long time2 = (new Date()).getTime() - (14 * 24 * 60 * 60 * 1000);
// 21 days ago
long time3 = (new Date()).getTime() - (21 * 24 * 60 * 60 * 1000);
Date date0 = new Date();
date0.setTime(time0);
Date date1 = new Date();
date1.setTime(time1);
Date date2 = new Date();
date2.setTime(time2);
Date date3 = new Date();
date3.setTime(time3);
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Table table = dynamoDB.getTable(tableName);
System.out.println("Adding data to " + tableName);
// Add threads.
Item item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 1")
.withString("ReplyDateTime", (dateFormatter.format(date3)))
.withString("Message", "DynamoDB Thread 1 Reply 1 text").withString("PostedBy", "User A");
table.putItem(item);
item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 1")
.withString("ReplyDateTime", dateFormatter.format(date2))
.withString("Message", "DynamoDB Thread 1 Reply 2 text").withString("PostedBy", "User B");
table.putItem(item);
item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 2")
.withString("ReplyDateTime", dateFormatter.format(date1))
.withString("Message", "DynamoDB Thread 2 Reply 1 text").withString("PostedBy", "User A");
table.putItem(item);
item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 2")
.withString("ReplyDateTime", dateFormatter.format(date0))
.withString("Message", "DynamoDB Thread 2 Reply 2 text").withString("PostedBy", "User A");
table.putItem(item);
} catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}
}