Google bigquery 如何为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
类似于使用序列生成唯一值或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无法并行化,因此错误太严重
generate_UUID()
函数调用简单地生成它们。这将为您提供一个通用的唯一UUID,您可以将其用作代理键值
一个缺点是该键将是32位,而不是8字节的INT64值。因此,如果您有大量记录,这可能会增加数据的存储大小
选项2-生成唯一散列
第二个选项是使用哈希函数生成唯一的has。这更复杂一些,因为您需要找到列和/或随机其他输入的组合,以确保永远不会两次生成相同的值
一些散列函数还将输出一个32字节的值,这样您就不会在存储上进行保存,但FARM_FINGERPRINT()散列函数将输出一个INT64值,这样可以节省一些存储空间。因此,您可以通过执行以下操作,使用选项1和选项2生成唯一的整数代理键:
FARM\u FINGERPRINT(GENERATE\u UUID())
这是非常广泛的,因为有很多方法可以做到这一点。不过,BQ中没有自动生成的内容,因此您必须自己编写代码才能生成唯一的值。两个查询都失败,错误为:“查询执行期间超出了资源:无法在分配的内存中执行查询。用于OVER(ORDER BY)的排序运算符占用了太多内存…”“按操作排序”非常昂贵,无法并行处理。所以在一个节点上内存中保存的行太多了。我相信这是最好的解决方案。在这里链接谷歌的相关帖子