Kudu auto生成关键栏目

时间:2016-05-25 14:22:34

标签: apache-kudu

我正在尝试在Kudu中制作自定义自动生成/递增键,它将继续增加其值 - 从默认为零的起始种子。

查看所有记录并递增计数器以获取行计数效率非常低。

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

3 个答案:

答案 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)

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

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

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

  3. 使用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"          |
|-------|--------------|