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

Google bigquery 如何为BigQuery表中的记录生成唯一的键值?,google-bigquery,Google Bigquery,在BigQuery表中插入记录时,如何分配代理键? 类似于使用序列生成唯一值或NextVal?以下是一种为每行生成唯一整数ID的方法,ID根据源数据集中的某个值排序,在本例中为时间戳: SELECT RANK() OVER(ORDER BY timestamp) unique_id, title FROM [publicdata:samples.wikipedia] LIMIT 1000 另一种方法是随机生成唯一标识符: SELECT RANK() OVER(ORDER

在BigQuery表中插入记录时,如何分配代理键?
类似于使用序列生成唯一值或NextVal?

以下是一种为每行生成唯一整数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表中,然后修改上面的代码以从该表(而不是wikipedia)中进行选择并保存结果。

(抱歉,声誉不足,无法对现有答案添加注释…)

加载数据的来源和格式是什么?如果是GCS下的CSV或JSON,那么您可以将Michael的解决方案与我们的联邦数据源()配对,以便在一个操作中生成表和id,而不是同时具有加载和查询

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
  • 注意:最后3个元素是scd2字段,需要新样式的SQL 工作语法

  • nb2:如果您在第_行按顺序订购,BigQuery可能会抛出 由于ORDER BY无法并行化,因此错误太严重


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

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

当您有少量记录时,这总是会导致您遇到问题

有两种选择:

选项1-生成UUID()

由于代理密钥没有业务意义,只是生成用于数据仓库的唯一密钥,因此您可以使用BigQuery中的
generate_UUID()
函数调用简单地生成它们。这将为您提供一个通用的唯一UUID,您可以将其用作代理键值

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

选项2-生成唯一散列

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

一些散列函数还将输出一个32字节的值,这样您就不会在存储上进行保存,但FARM_FINGERPRINT()散列函数将输出一个INT64值,这样可以节省一些存储空间。因此,您可以通过执行以下操作,使用选项1和选项2生成唯一的整数代理键:
FARM\u FINGERPRINT(GENERATE\u UUID())

这是非常广泛的,因为有很多方法可以做到这一点。不过,BQ中没有自动生成的内容,因此您必须自己编写代码才能生成唯一的值。两个查询都失败,错误为:“查询执行期间超出了资源:无法在分配的内存中执行查询。用于OVER(ORDER BY)的排序运算符占用了太多内存…”“按操作排序”非常昂贵,无法并行处理。所以在一个节点上内存中保存的行太多了。我相信这是最好的解决方案。在这里链接谷歌的相关帖子