Impala 中的增量整数 ID

Incremental integer ID in Impala

我正在使用 Impala 来查询 parquet-表,但找不到解决方案来增加 integer-列,范围从 1..n。该列应该用作 ID 参考。目前我知道 uuid() 函数,

Returns a universal unique identifier, a 128-bit value encoded as a string with groups of hexadecimal digits separated by dashes.

无论如何,这不适合我,因为我必须将 ID 传递给另一个请求 1..n 样式 ID 的系统。我也已经知道 Impala 没有 auto-increment-实现。

所需的结果应如下所示:

-- UUID() provided as example - I want to achieve the `my_id`-column.

| my_id | example_uuid | some_content |
|-------|--------------|--------------|
| 1     | 50d53ca4-b...| "a"          |
| 2     | 6ba8dd54-1...| "b"          |
| 3     | 515362df-f...| "c"          |
| 4     | a52db5e9-e...| "d"          |
|-------|--------------|--------------|

我怎样才能达到预期的结果(integer-ID 范围从 1..n)?


注意:这个问题不同于专门处理 Kudu 表的 。但是,答案也应该适用于这个问题。

由于其他问答如只给出了uuid()类似的答案,我想了想终于想出了这个解决方案:

SELECT
    row_number() OVER (PARTITION BY "dummy" ORDER BY "dummy") as my_id
    , some_content
FROM some_table
  • row_number() 在提供的分区上生成一个连续的 integer-number。与 rank() 不同,row_number() 始终在其分区上提供递增的数字(即使出现重复)
  • PARTITION BY "dummy" 将整个 table 划分为一个分区。这是有效的,因为 "dummy" 在执行图中被解释为临时列,仅产生 String"dummy"。因此,类似于 "dummy" 的东西也起作用。
  • 需要
  • ORDER BY 才能生成增量。由于我们不关心此示例中的顺序(否则只需设置您各自的列),也使用 "dummy"-解决方法。

该命令无需任何嵌套 SQL 语句或其他技巧即可创建所需的增量 ID。

| my_id | some_content |
|-------|--------------|
| 1     | "a"          |
| 2     | "b"          |
| 3     | "c"          |
| 4     | "d"          |
|-------|--------------|

我对大型分区 table 使用了 Markus 的回答,发现我得到了重复的 ID。我认为 id 仅在其分区内是唯一的;可能 PARTITION BY "dummy" 导致 Impala 认为每个分区都可以单独执行 row_number()。我能够通过指定一个实际的列来排序并且没有分区来让它工作:

SELECT
    row_number() OVER (ORDER BY actual_column) as my_id
    , some_content
FROM some_table

列中的值是否唯一似乎并不重要(我的不是),但使用实际分区键可能会导致与“虚拟”列相同的问题。

可以理解,运行 比虚拟版本花费的时间要长得多。