我正在尝试在 Kudu 中制作自定义的自动生成/增量密钥,这将不断增加其值 - 从默认情况下为零的起始种子开始。
遍历所有记录并增加计数器以获取行数是非常低效的。
Kudu 是否提供开箱即用的行数?如果没有,获得它的最佳方法是什么?
我正在尝试在 Kudu 中制作自定义的自动生成/增量密钥,这将不断增加其值 - 从默认情况下为零的起始种子开始。
遍历所有记录并增加计数器以获取行数是非常低效的。
Kudu 是否提供开箱即用的行数?如果没有,获得它的最佳方法是什么?
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 成员。
有几种方法可以解决这个问题。
使用 impala 的 uuid() 函数生成唯一的 id。
将 uuid() 转换为 BIGINT(通过散列等)
使用 impala 的 unix_timestamp 生成一个 BIGINT 值,将当前日期和时间表示为 Unix 纪元的增量(这可能会导致一些冲突,因此如果要将其用作主键,最好添加另一列。
除了@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" |
|-------|--------------|