0

我正在使用 GridDB,并且在插入过程中观察到记录丢失,这归因于缺少时间戳字段的定义。

我试图在输入字段中给出更多定义,但保存它会使其修剪。日志不表示任何数据丢失或错误写入。

查询数据库:

[{
"columns":[
  {"name":"original_timestamp","type":"TIMESTAMP"},
  {"name":"FIELD_A","type":"STRING"}
  ...
  {"name":"FIELD_Z","type":"STRING"}
  {"name":"code_timestamp","type":"STRING"}],
  "results":[
  "2019-07-19T11:28:42.328Z",
  "SOME String Value for A",
  ...
  "SOME String Value for Z",
  "2019-07-19 11:28:59.239922"}
]

注册摄取的数量低于预期。我们正在研究基于两个索引的模型。还有其他想法和/或有用的经验吗?

提前致谢!

4

1 回答 1

1

GridDB 以毫秒分辨率存储 TIMESTAMP 值,插入具有更高分辨率(例如微秒或纳秒分辨率)的记录将导致时间戳值被截断。有三种方法可以解决时间戳冲突:

  1. 使用具有 long 作为您的第一个索引的集合。在那长时间内,根据需要以微秒或纳秒为单位存储一个 Unix 纪元。您显然会丢失一些时间序列函数,并且必须手动将比较运算符转换为所需分辨率的 Unix 纪元。

  2. 使用集合并禁用行键(Java 中没有 @RowKey 标记,或者在其他语言中将 ContainerInfo 中的最后一个布尔值设置为 False)。这将允许多条记录具有相同的“行键值”。您可以在此列上启用二级索引以确保查询仍然快速。TIMESTAMP 和 TO_TIMESTAMP_MS 函数仍然可以工作,但我相当肯定其他特殊的时间戳函数都不会工作。当我不得不处理 GridDB 中的时间戳冲突时,这是我选择的解决方案。

  3. 在插入之前检测碰撞,如果要发生碰撞,请将碰撞记录写入单独的容器中。使用 multi-get/query 查询所有容器。

于 2019-08-02T02:25:58.283 回答