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

Posted

技术标签:

【中文标题】如何为 BigQuery 表中的记录生成唯一键值?【英文标题】:How can I generate unique key values for records in a BigQuery table? 【发布时间】:2015-11-17 19:54:57 【问题描述】:

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

【问题讨论】:

这个范围很广,因为有很多方法可以做到这一点。但是 BQ 中没有任何东西是自动化的,所以你必须自己编写代码才能产生独特的价值。 【参考方案1】:

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

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

即使只有少量记录,这也总会导致您遇到问题。

有两种选择:

选项 1 - GENERATE_UUID()

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

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

选项 2 - 生成唯一哈希

第二种选择是使用散列函数来生成唯一的拥有。这涉及更多一点,因为您需要找到列和或随机其他输入的组合,以确保您永远不会两次生成相同的值。

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

【讨论】:

我相信这个线程中的最佳解决方案。在此处链接来自 Google 的相关帖子cloud.google.com/blog/products/data-analytics/…【参考方案2】:

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

【讨论】:

两个查询都失败并出现错误:“查询执行期间资源超出:无法在分配的内存中执行查询。用于 OVER(ORDER BY) 的排序运算符使用了太多内存..” ORDER BY操作非常昂贵,不能并行处理。因此,在单个节点上的内存中存在太多行。【参考方案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 中排序,BigQuery 可能会抛出 一个太难的错误,因为 ORDER BY 无法并行化

【讨论】:

以上是关于如何为 BigQuery 表中的记录生成唯一键值?的主要内容,如果未能解决你的问题,请参考以下文章

如何为字段的每个唯一值生成随机记录?

如何为mysql中的数据记录添加一个唯一的编号,在查询的时候可以根据这个编号对这条记录进行操作。

从 BigQuery 中删除重复记录

如何为mysql中的每条记录检索表中的两条记录

如何为android中的字符串输入生成唯一的哈希码...?

如何为数据库中的列生成唯一字符串?