是否可以从特定的Unix时间戳生成Scala / Java中的Type 1 UUID(用于Cassandra),以便可以使用它来获取记录的范围切片和表中的单个记录。以下结果似乎表明它可能。
import com.datastax.driver.core.utils._
var td = new DateTime(2003,1,1,0,0)
val time_millis = td.getMillis()
val lower = UUIDs.startOf(time_millis)
val upper = UUIDs.endOf(time_millis)
println(lower.getLeastSignificantBits()) # 9187201950435737472
println(lower.getMostSignificantBits()) # -545498504376938025
println(upper.getLeastSignificantBits()) # -9187201950435737471
println(upper.getMostSignificantBits()) # -545455558998945321
背景(如果有更好的方法可以解决问题)。
我想批量导入几千辆车辆记录到一个Cassandra数据库中。包含日期的列包含车辆被添加到原始数据库(VCA)的日期,并且通常在特定日期添加的数量不超过几百,这似乎表明在timeuuid中可用的熵可能足以解决此问题;即mac地址,小时,秒,......,100纳秒和随机部分。
我需要执行的示例查询
SELECT * FROM vehicles WHERE manufacturer = 'BMW';
SELECT * FROM vehicles WHERE manufacturer = 'BMW' AND id = a8bb5800-694c-11d7-8080-808080808080;
SELECT * FROM vehicles WHERE manufacturer = 'BMW' AND id < a8bb5800-694c-11d7-8080-808080808080 AND id >= cb59c000-1c26-11d6-8080-808080808080;
CQL中的表模式。
CREATE TABLE vehicles (
id timeuuid,
manufacturer text,
model text,
transmission text,
description text,
engine_capacity double,
fuel_type text,
metric_urban double,
metric_extra_urban double,
metric_combined double,
co2_g_per_km double,
euro_standard int,
noise double,
co double,
hc_nox double,
hc double,
nox double,
particulates double,
date_included timestamp,
PRIMARY KEY (manufacturer, id)
) WITH CLUSTERING ORDER BY (id ASC);
配套制造商表
SELECT * from manufacturers;
CREATE TABLE manufacturers (
id uuid,
manufacturer text,
years set<int>
PRIMARY KEY (manufacturer, id)
);
答案 0 :(得分:3)
我想在理论上可以做到这一点。但是,没有标准的Java API允许您在生成UUID时指定“当前时间”。
这不是如何使用类型1 UUID的方式。 (不能承受Cassandra根据时间选择“timeuuid”值的能力!)嵌入式时间戳是保证唯一性的方案的一部分......仅此而已。如果您开始人工生成类型1 UUID的时间与当前时间不同,则会产生(理论上)问题,即您的“新”UUID实际上可能与在该计算机上真正创建的UUID相同;即你的UUID不再是唯一的。
如果我这样做,我将以正常方式生成UUID并将时间戳存储在单独的字段中。
<强>更新强>
您可以调整“https://github.com/cowtowncoder/java-uuid-generator”来做您想做的事情。 (提示:写一个棘手的“时间戳同步器”)。但我仍然认为这是一个坏主意。