【问题标题】:Incremental integer ID in ImpalaImpala 中的增量整数 ID
【发布时间】:2021-04-12 14:05:37
【问题描述】:

我正在使用 Impala 查询 parquet-tables,但无法找到增加 integer-column 范围为 1..n 的解决方案。该列应该用作 ID 参考。目前我知道uuid() 函数,它

返回一个通用的唯一标识符,一个 128 位的值,编码为一个字符串,其中包含由破折号分隔的十六进制数字组。

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

想要的结果应该是这样的:

-- 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 表的 this one 不同。但是,答案也应该适用于这个问题。

【问题讨论】:

    标签: sql impala


    【解决方案1】:

    由于像this one 这样的其他问答只提出了uuid()-alike 的答案,所以我考虑了一下,最终想出了这个解决方案:

    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" 将整个表分区为一个分区。这是因为"dummy" 在执行图中被解释为临时列,只产生String-值"dummy"。因此,类似于"dummy" 的东西也可以工作。
    • 需要ORDER BY 才能生成增量。由于我们不关心此示例中的顺序(否则只需设置您各自的列),还可以使用"dummy"-workaround。

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

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

    【讨论】:

      【解决方案2】:

      我将 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
      

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

      可以理解,它的运行时间比虚拟版本要长很多。

      【讨论】:

      • 嘿斯蒂芬,您的回答似乎更像是一个评论,因为它取决于您的特定配置或表结构。请注意,PARTITION BY 与您的实际物理分区无关(请阅读文档here),其行为类似于GROUP BY。因此,如果您遇到问题,您必须检查您是否在some_content 中意外分组了某些内容。 SO 的答案总是必须适应自己的问题。
      猜你喜欢
      • 2016-05-24
      • 2015-04-26
      • 1970-01-01
      • 2016-07-08
      • 2015-04-01
      • 2022-11-20
      • 2021-04-01
      • 2014-10-26
      • 1970-01-01
      相关资源
      最近更新 更多