如何为 BigQuery 表中的记录生成唯一键值?

问题描述 投票:0回答:4

在 BigQuery 表中插入记录时如何分配代理键? 像使用 Sequence 生成唯一值或 NextVal 之类的东西?

google-bigquery
4个回答
13
投票

如果您希望在 BigQuery 中生成代理键值,那么最好避免使用 ROW_NUMBER OVER () 选项及其变体。引用 BigQuery 关于代理键的帖子:

要实现 ROW_NUMBER(),BigQuery 需要在根对值进行排序 执行树的节点,受内存量限制 在一个执行节点中。

即使您的记录数量很少,这也总会导致您遇到问题。

有两种选择:

选项 1 - GENERATE_UUID()

由于代理键没有商业意义,只是生成用于数据仓库的唯一键,因此您可以使用 BigQuery 中的

GENERATE_UUID()
函数调用简单地生成它们。这为您提供了一个通用唯一的 UUID,您可以将其用作代理键值。

一个缺点是该密钥将是 32 位,而不是 8 字节 INT64 值。因此,如果您有大量记录,这可能会增加数据的存储大小。

选项 2 - 生成唯一的哈希

第二个选项是使用哈希函数来生成唯一的has。这有点复杂,因为您需要找到列和/或随机其他输入的组合,以确保您永远不会两次生成相同的值。

某些哈希函数还会输出 32 字节值,因此您不会节省存储空间,但 FARM_FINGERPRINT() 哈希函数将输出 INT64 值,这可以节省一些存储空间。因此,您可以通过执行以下操作,利用选项 1 和选项 2 生成唯一的整数代理键:

FARM_FINGERPRINT(GENERATE_UUID())


4
投票

这是一种为每行生成唯一整数 ID 的方法,这些 ID 根据源数据集中的某个值(在本例中为时间戳)进行排序:

SELECT
  RANK() OVER(ORDER BY timestamp) unique_id,
  title
FROM
  [publicdata:samples.wikipedia]
LIMIT 1000

另一种方法是随机生成唯一标识符:

SELECT 
    RANK() OVER(ORDER BY random) unique_id,
    RAND() random,
    title
FROM
    [publicdata:samples.wikipedia]
LIMIT 1000

要在插入时附加这些值,请将源数据加载到 BigQuery 表中,然后修改上面的代码以从该表(而不是维基百科)中进行选择并保存结果。


3
投票

我就是这样做的

SELECT
   (ROW_NUMBER() OVER ()) 
   + 
   (
      SELECT
         MAX(surrogate_key)
      FROM
         dimension_table ) AS surrogate_key,
   business_key,
   attribute1,
   attributen,
   CURRENT_DATE AS start_date, 
   null as end_date,   
   true AS is_current
FROM
  source_table
  • nb :最后 3 个元素是 scd2 字段,需要新样式的 SQL 工作语法

  • nb2:如果您在 Row_number 中 ORDER BY,BigQuery 可能会抛出 一个太难的错误,因为 ORDER BY 无法并行化


0
投票

除了上面 @Twist 提供的答案之外,您还可以使用

FARM_FINGERPRINT()
函数确保
ABS()
函数生成正值。这保证了
FARM_FINGERPRINT()
函数的输出始终为正,无论输入如何。

这是代码片段的更新版本:

ABS(FARM_FINGERPRINT(GENERATE_UUID()))

通过使用

FARM_FINGERPRINT()
包装
ABS()
函数,您可以避免生成的唯一标识符 (UID) 中出现负值。

© www.soinside.com 2019 - 2024. All rights reserved.