我目前正在为 3 节点集群上的分析项目评估 Kinetica DB,以在其上构建自定义仪表板。
据我了解,有一种方法可以直接从数据节点中检索记录,称为“多头查找”。
使用 Java API 时,它似乎只从第一个节点连接和请求数据(也检查了 Wireshark)。知道有什么问题吗?
该表在 vendor_id 和 rate_code_id 上进行了分片,当在 Admin-UI 中按下“dist”按钮时,它表明一切都正确分布。
这是我的 DDL:
CREATE TABLE "demo"."nyctaxi_sharded"
(
"vendor_id" VARCHAR (4, shard_key) NOT NULL,
"pickup_datetime" TIMESTAMP NOT NULL,
"dropoff_datetime" TIMESTAMP NOT NULL,
"passenger_count" TINYINT NOT NULL,
"trip_distance" REAL NOT NULL,
"pickup_longitude" REAL NOT NULL,
"pickup_latitude" REAL NOT NULL,
"rate_code_id" SMALLINT (shard_key) NOT NULL,
"store_and_fwd_flag" VARCHAR (1) NOT NULL,
"dropoff_longitude" REAL NOT NULL,
"dropoff_latitude" REAL NOT NULL,
"payment_type" VARCHAR (16) NOT NULL,
"fare_amount" REAL NOT NULL,
"surcharge" REAL NOT NULL,
"mta_tax" REAL NOT NULL,
"tip_amount" REAL NOT NULL,
"tolls_amount" REAL NOT NULL,
"total_amount" REAL NOT NULL,
"cab_type" TINYINT NOT NULL
)
TIER STRATEGY (
( ( VRAM 1, RAM 5, PERSIST 5 ) )
);
这是截断的Java代码:
GPUdb gpudb = new GPUdb("http://myserver:9191", new GPUdbBase.Options().setUsername("user").setPassword("pw"));
Type tableType = Type.fromTable(gpudb, "demo.nyctaxi_sharded");
RecordRetriever<GenericRecord> recordRetriever = new RecordRetriever<>(gpudb, "demo.nyctaxi_sharded", tableType);
List<List<Object>> lookupValues = Arrays.asList(
Arrays.asList("VENDOR1", 0),
Arrays.asList("VENDOR2", 0),
Arrays.asList("VENDOR3", 0),
Arrays.asList("VENDOR1", 1),
Arrays.asList("VENDOR2", 1),
Arrays.asList("VENDOR3", 1),
Arrays.asList("VENDOR1", 2),
Arrays.asList("VENDOR2", 2),
Arrays.asList("VENDOR3", 2));
lookupValues.forEach(lookup -> {
try {
GetRecordsResponse<GenericRecord> record = recordRetriever.getByKey(lookup, "");
System.out.println(record);
} catch (GPUdbException e) {
e.printStackTrace();
}
});
一旦这工作,我想在预先计算的物化视图上使用这个查找。这可能吗?