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
列中的值是否唯一似乎并不重要(我的不是),但使用实际分区键可能会导致与“虚拟”列相同的问题。
可以理解,运行 比虚拟版本花费的时间要长得多。
我正在使用 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
列中的值是否唯一似乎并不重要(我的不是),但使用实际分区键可能会导致与“虚拟”列相同的问题。
可以理解,运行 比虚拟版本花费的时间要长得多。