package com.xiaomi.infra.galaxy.sds.examples; import com.xiaomi.infra.galaxy.sds.client.ClientFactory; import com.xiaomi.infra.galaxy.sds.client.TableScanner; import com.xiaomi.infra.galaxy.sds.thrift.AdminService; import com.xiaomi.infra.galaxy.sds.thrift.BatchOp; import com.xiaomi.infra.galaxy.sds.thrift.BatchRequest; import com.xiaomi.infra.galaxy.sds.thrift.BatchRequestItem; import com.xiaomi.infra.galaxy.sds.thrift.BatchResult; import com.xiaomi.infra.galaxy.sds.thrift.CannedAcl; import com.xiaomi.infra.galaxy.sds.thrift.CommonConstants; import com.xiaomi.infra.galaxy.sds.thrift.Credential; import com.xiaomi.infra.galaxy.sds.thrift.DataType; import com.xiaomi.infra.galaxy.sds.thrift.Datum; import com.xiaomi.infra.galaxy.sds.thrift.DatumUtil; import com.xiaomi.infra.galaxy.sds.thrift.GetRequest; import com.xiaomi.infra.galaxy.sds.thrift.GetResult; import com.xiaomi.infra.galaxy.sds.thrift.KeySpec; import com.xiaomi.infra.galaxy.sds.thrift.ProvisionThroughput; import com.xiaomi.infra.galaxy.sds.thrift.PutRequest; import com.xiaomi.infra.galaxy.sds.thrift.Request; import com.xiaomi.infra.galaxy.sds.thrift.ScanRequest; import com.xiaomi.infra.galaxy.sds.thrift.ScanResult; import com.xiaomi.infra.galaxy.sds.thrift.TableMetadata; import com.xiaomi.infra.galaxy.sds.thrift.TableQuota; import com.xiaomi.infra.galaxy.sds.thrift.TableSchema; import com.xiaomi.infra.galaxy.sds.thrift.TableService; import com.xiaomi.infra.galaxy.sds.thrift.TableSpec; import com.xiaomi.infra.galaxy.sds.thrift.UserType; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; public class Basic { private static AdminService.Iface adminClient; private static TableService.Iface tableClient; private static String accountKey = ""; // Your AccountKey private static String accountSecret = ""; // Your AccountSecret private static String endpoint = "http://cnbj-s0.sds.api.xiaomi.com"; private static boolean isInit = false; private static String tableName = "java-test-weather"; private static String[] cities = { "北京", "Beihai", "Dalian", "Dandong", "Fuzhou", "Guangzhou", "Haikou", "Hankou", "Huangpu", "Jiujiang", "Lianyungang", "Nanjing", "Nantong", "Ningbo", "Qingdao", "Qinhuangdao", "Rizhao", "Sanya", "Shanghai", "Shantou", "Shenzhen", "Tianjin", "Weihai", "Wenzhou", "Xiamen", "Yangzhou", "Yantai" }; private static Credential getCredential(String secretKeyId, String secretKey, UserType userType) { return new Credential().setSecretKeyId(secretKeyId).setSecretKey(secretKey) .setType(userType); } public static AdminService.Iface createAdminClient(String host) { Credential credential = getCredential(accountKey, accountSecret, UserType.DEV_XIAOMI); ClientFactory clientFactory = new ClientFactory().setCredential(credential); return clientFactory.newAdminClient(host + CommonConstants.ADMIN_SERVICE_PATH, 50000, 3000); } public static TableService.Iface createTableClient(String host) { Credential credential = getCredential(accountKey, accountSecret, UserType.APP_SECRET); // based on JSON transport protocol // clientFactory = new ClientFactory().setCredential(credential).setProtocol(ThriftProtocol.TJSON); // based on Compact Binary transport protocol // clientFactory = new ClientFactory().setCredential(credential).setProtocol(ThriftProtocol.TCOMPACT); // based on default Binary transport protocol ClientFactory clientFactory = new ClientFactory().setCredential(credential); return clientFactory.newTableClient(host + CommonConstants.TABLE_SERVICE_PATH, 10000, 3000, true, 5); } public static Map<String, List<CannedAcl>> cannedAclGrant(String appId, CannedAcl... cannedAcls) { Map<String, List<CannedAcl>> appGrant = new HashMap<String, List<CannedAcl>>(); appGrant.put(appId, Arrays.asList(cannedAcls)); return appGrant; } private static void init() { adminClient = createAdminClient(endpoint); tableClient = createTableClient(endpoint); isInit = true; } private static TableSpec tableSpec() { List<KeySpec> primaryKey = Arrays .asList(new KeySpec[] { new KeySpec().setAttribute("cityId"), new KeySpec().setAttribute( "timestamp").setAsc(false) }); Map<String, DataType> attributes = new HashMap<String, DataType>(); attributes.put("cityId", DataType.STRING); attributes.put("timestamp", DataType.INT64); attributes.put("score", DataType.DOUBLE); attributes.put("pm25", DataType.INT64); TableSchema tableSchema = new TableSchema(); tableSchema.setPrimaryIndex(primaryKey) .setAttributes(attributes) .setTtl(-1); TableMetadata tableMetadata = new TableMetadata(); tableMetadata .setQuota(new TableQuota().setSize(100 * 1024 * 1024)) .setThroughput(new ProvisionThroughput().setReadCapacity(20).setWriteCapacity(20)); return new TableSpec().setSchema(tableSchema) .setMetadata(tableMetadata); } private static void printResult(Map<String, Datum> resultToPrint) { if (resultToPrint != null) { for (Map.Entry<String, Datum> e : resultToPrint.entrySet()) { System.out.println( String.format("[%s] => %s", e.getKey(), DatumUtil.fromDatum(e.getValue()).toString())); } } } public static void main(String[] args) throws Exception { init(); TableSpec tableSpec = tableSpec(); adminClient.createTable(tableName, tableSpec); try { System.out.println("table " + tableName + ":"); System.out.println(adminClient.describeTable(tableName)); System.out.println("All tables belong to you:"); System.out.println(adminClient.findAllTables()); // put data Date now = new Date(); PutRequest putRequest = new PutRequest(); for (int i = 0; i < 10; i++) { putRequest.clear(); putRequest.setTableName(tableName); putRequest.putToRecord("cityId", DatumUtil.toDatum(cities[i])); putRequest.putToRecord("timestamp", DatumUtil.toDatum(now.getTime())); putRequest.putToRecord("score", DatumUtil.toDatum((double) new Random().nextInt(100))); putRequest.putToRecord("pm25", DatumUtil.toDatum((long) (new Random().nextInt(500)))); tableClient.put(putRequest); System.out.println("put record #" + i); } // batch put by partialAllowedBatch List<BatchRequestItem> batch = new ArrayList<BatchRequestItem>(); for (int i = 11; i < 20; i++) { BatchRequestItem item = new BatchRequestItem().setAction(BatchOp.PUT); Map<String, Datum> record = new HashMap<String, Datum>(); record.put("cityId", DatumUtil.toDatum(cities[i])); putRequest.putToRecord("timestamp", DatumUtil.toDatum(now.getTime())); putRequest.putToRecord("score", DatumUtil.toDatum((double) new Random().nextInt(100))); putRequest.putToRecord("pm25", DatumUtil.toDatum((long) (new Random().nextInt(500)))); item.setRequest(Request.putRequest(new PutRequest().setTableName(tableName).setRecord(record))); batch.add(item); } while (true) { BatchResult br = tableClient.partialAllowedBatch(new BatchRequest().setItems(batch)); List<BatchRequestItem> request = new ArrayList<BatchRequestItem>(); for (int i = 0; i < br.getItems().size(); i++) { //At current only quota exceeded will get isSuccess() == false if (!br.getItems().get(i).isSuccess()) { request.add(batch.get(i)); } } if (request.isEmpty()) { break; } Thread.sleep(100); // wait a while to retry. batch = request; } // get data GetRequest getRequest = new GetRequest(); getRequest.setTableName(tableName); getRequest.putToKeys("cityId", DatumUtil.toDatum(cities[0])); getRequest.putToKeys("timestamp", DatumUtil.toDatum(now.getTime())); getRequest.addToAttributes("pm25"); GetResult getResult = tableClient.get(getRequest); printResult(getResult.getItem()); // scan data ScanRequest scanRequest = new ScanRequest(); scanRequest.setTableName(tableName); scanRequest.addToAttributes("cityId"); scanRequest.addToAttributes("score"); scanRequest.setCondition("score > 50"); scanRequest.setLimit(10); ScanResult scanResult = tableClient.scan(scanRequest); List<Map<String, Datum>> kvsList = scanResult.getRecords(); for (Map<String, Datum> kvs : kvsList) { printResult(kvs); } // scan the whole table with retry scanRequest.clear(); scanRequest.setTableName(tableName); TableScanner scanner = new TableScanner(tableClient, scanRequest); Iterator<Map<String, Datum>> iterator = scanner.iterator(); while (iterator.hasNext()) { printResult(iterator.next()); } } finally { adminClient.disableTable(tableName); adminClient.dropTable(tableName); } } }