在BigQuery表中插入记录时如何分配代理键?像使用Sequence生成唯一值或NextVal的东西?
如果您希望在 BigQuery 中生成代理键值,那么最好避免使用 ROW_NUMBER OVER () 选项及其变体。引用有关代理键的 BigQuery 帖子:
为了实现 ROW_NUMBER(),BigQuery 需要在执行树的根节点对值进行排序,这受限于一个执行节点的内存量。
当您拥有少量记录时,这总是会导致您遇到问题。
有两种选择:
选项 1 - GENERATE_UUID()
由于代理键没有业务意义,只是生成用于数据仓库的唯一键,因此您可以使用GENERATE_UUID()BigQuery 中的函数调用简单地生成它们。这为您提供了一个通用唯一的 UUID,您可以将其用作代理键值。
一个缺点是该密钥将是 32 位而不是 8 字节的 INT64 值。因此,如果您有大量记录,这可能会增加数据的存储大小。
选项 2 - 生成唯一的哈希
第二种选择是使用散列函数来生成唯一的has。这有点复杂,因为您需要找到列的组合和/或其他随机输入,以确保您永远不会两次生成相同的值。
一些散列函数还会输出一个 32 字节的值,因此您不会节省存储空间,但 FARM_FINGERPRINT() 散列函数将输出一个 INT64 值,这可以节省一些存储空间。因此,您可以使用选项 1 和选项 2 通过执行以下操作来生成唯一的整数代理键:
FARM_FINGERPRINT(GENERATE_UUID())
这是一种为每行生成唯一整数ID的方法,其ID根据源datasaet中的某个值进行排序,在本例中为时间戳:
SELECT
RANK() OVER(ORDER BY timestamp) unique_id,
title
FROM
[publicdata:samples.wikipedia]
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)
另一种方法是随机生成唯一标识符:
SELECT
RANK() OVER(ORDER BY random) unique_id,
RAND() random,
title
FROM
[publicdata:samples.wikipedia]
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)
要在插入时附加这些值,请将源数据加载到BigQuery表中,然后修改上面的代码以从该表中选择(而不是维基百科)并保存结果.
我这样做
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
Run Code Online (Sandbox Code Playgroud)
注意:最后 3 个元素是 scd2 字段,需要新样式的 SQL 语法才能工作
nb2 :如果您在 Row_number 中 ORDER BY,BigQuery 可能会抛出一个太难的错误,因为 ORDER BY 无法并行化
| 归档时间: |
|
| 查看次数: |
5124 次 |
| 最近记录: |