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

时间:2015-11-17 19:54:58

标签: google-bigquery

如何在BigQuery表中插入记录时指定代理键? 像使用Sequence生成唯一值或NextVal?

4 个答案:

答案 0 :(得分:5)

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

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表中,然后修改上面的代码以从该表中选择(而不是维基百科)并保存结果。

答案 1 :(得分:3)

(抱歉,还没有足够的声誉来添加对现有答案的评论......)

您从哪里加载数据的来源和格式?如果它是关闭GCS的CSV或JSON,那么您可以将迈克尔的解决方案与我们的联合数据源(https://cloud.google.com/bigquery/federated-data-sources)配对,以在单个操作中生成表和ID,而不是同时加载和查询。

答案 2 :(得分: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无法并行化

答案 3 :(得分:1)

如果您希望在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())