3

我正在尝试在 Kudu 中制作自定义的自动生成/增量密钥,这将不断增加其值 - 从默认情况下为零的起始种子开始。

遍历所有记录并增加计数器以获取行数是非常低效的。

Kudu 是否提供开箱即用的行数?如果没有,获得它的最佳方法是什么?

4

3 回答 3

2

Apache Kudu 目前不支持AUTO_INCREMENT列。Kudu 网站上有一个FAQ 条目提到了这一点。

Kudu 是一个分布式存储引擎,专注于成为一个好的分析存储 (OLAP) 而不是一个好的事务存储 (OLTP),它显示了我们迄今为止优先考虑的功能。这是一个很好的例子。

因为我们不是想成为一个 OLTP 存储,Kudu 还没有实现多行或多节点事务,所以此时一个简单的递增主键计数器将难以正确实现——尤其是当该表在主键上进行了哈希分区。我们需要一个当前不存在的中央事务协调器。

要回答您的第二个问题,目前在 Kudu 中获取行数有点贵,因为它涉及扫描每个平板电脑上的索引列并总结总计数。如果您这样做,Apache Impala / Apache Spark SQL 将为您透明地执行此操作,SELECT COUNT(*) from kudu_table但我目前不会依赖它来分配新 ID,因为 Impala 目前允许从稍微陈旧的 Kudu 副本进行扫描,因此可能会关闭行数。

现在最好的办法是依靠一些外部机制来分配行 ID。

资料来源:我是 Apache Kudu 的 PMC 成员。

于 2017-05-21T03:54:12.993 回答
1

有几种方法可以解决这个问题。

  1. 使用 impala 的 uuid() 函数生成唯一的 id。

  2. 将 uuid() 转换为 BIGINT(通过散列等)

  3. 使用 impala 的 unix_timestamp 生成一个 BIGINT 值,将当前日期和时间表示为 Unix 纪元的增量(这可能会导致一些冲突,因此如果要将其用作主键,最好添加另一列。

于 2017-06-19T11:37:56.780 回答
1

除了@JoeyVanHalens 的回答之外,还有另一个选项,这里也在 SO 上进行了解释。您可以使用row_numer()创建一个类似于计数器的 ID,但如果您只想要一个类似的列,则不会强迫您进行一些繁琐的嵌套或其他操作counter

直截了当,它看起来像这样:

SELECT
    row_number() OVER (PARTITION BY "dummy" ORDER BY "dummy") as incremented_id
FROM some_table
  • row_number()在分区上创建一个递增的数字。与rank(),不同,row_number()即使您的分区包含重复项,也可以确保您有一个增量。
  • PARTITION BY "dummy"在运行时将临时"dummy"列解释为整个表的一个分区。因此,所有记录都会发生增量。
  • ORDER BY遵循相同的"dummy"逻辑。

当然,您也可以用"dummy"表格逻辑所需的任何列替换。

结果如下所示:

-- ID = incremented_id

| ID    | some_content |
|-------|--------------|
| 1     | "a"          |
| 2     | "b"          |
| 3     | "c"          |
| 4     | "d"          |
|-------|--------------|
于 2021-04-12T18:42:00.077 回答