我正在尝试在Kudu中制作自定义自动生成/递增键,它将继续增加其值 - 从默认为零的起始种子。
查看所有记录并递增计数器以获取行计数效率非常低。
Kudu是否提供开箱即用的行数? 如果没有,最好的方法是什么?
答案 0 :(得分:0)
Apache Kudu目前不支持AUTO_INCREMENT
列。 Kudu网站上有一个FAQ entry提到了这一点。
Kudu是一个分布式存储引擎,专注于成为一个优秀的分析存储(OLAP),而不是一个好的事务存储(OLTP),并且它显示在我们迄今为止优先考虑的功能中。这是一个很好的例子。
因为我们不想成为OLTP商店,所以Kudu还没有实现多行或多节点事务,因此一个简单的递增主键计数器很难正确实现时间 - 特别是例如当表在主键上进行散列分区时。我们需要一个目前尚不存在的中央交易协调员。
要回答你的第二个问题,在Kudu中获取行计数目前有点贵,因为它涉及扫描每个平板电脑上的索引列并总计总计数。如果您执行SELECT COUNT(*) from kudu_table
,Apache Impala / Apache Spark SQL将为您透明地执行此操作,但我目前还不会依赖它来分配新ID,因为Impala目前允许从稍微过时的扫描因此,Kudu复制品可能会在行数上消失。
现在最好的办法是依靠一些外部机制来分配行ID。
资料来源:我是Apache Kudu的PMC成员。
答案 1 :(得分:0)
有几种方法可以解决这个问题。
使用impala的uuid()函数生成唯一ID。
将uuid()转换为BIGINT(通过散列等)
使用impala的unix_timestamp生成一个BIGINT值,表示当前日期和时间为Unix纪元的增量(这可能会导致一些冲突,所以如果你要去的话,最好添加另一个列将此作为主键使用。
答案 2 :(得分:0)
除了@JoeyVanHalens 回答之外,还有另一个选项也解释了here on 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" |
|-------|--------------|