如何在BigQuery表中插入记录时指定代理键? 像使用Sequence生成唯一值或NextVal?
答案 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())