使用Farm_fingerprint进行Google Big查询

时间:2017-08-01 17:24:50

标签: google-bigquery

我有要导入Google Big Query的表格。 这些表是我的临时表,我使用Views将登台表转换为逻辑仓库表。 我的问题是代理键。

现在,ROW_NUMBER()失败了,因为我的数据太大了。

我被推荐使用FARM_FINGERPRINT

在Big Query中使用Surrogate_key生成是否有正确的方法?

由于

更新1以澄清。

我的一些源表有30个字段,包含数百万条记录。要大到这里显示。我们正在将这些记录转换为表格,需要创建代理键以便以后协助BI工具。

为此,我们的视图(用替换目标表)具有转换,另外我们使用ROW_NUMBER()函数来创建唯一的代理键。我们意识到该函数强制Big Query将整个逻辑推送到一个节点上,这会使查询崩溃。

我们正在使用FARM_FINGERPRINT(),使用一串连接字段表示唯一的业务键作为输入,以检索用作代理键的INT64值。我们相信这将提供一个整数,我们可以根据该团队的需要在BI工具中使用该整数。

我要问的是,当你有这么大的数据集时,有一种正确的方法可以在Google Big Query中生成基于整数的代理键吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您能找到一种不同的分区数据策略吗?

这失败了“超出资源”(正如预期的那样 - 请注意,我并不是要重复删除它们,而是为每个提及的数字编号):

SELECT author
  , ROW_NUMBER() OVER(ORDER BY created_utc)
FROM `fh-bigquery.reddit_comments.2017_06`

但我可以用第一个字母对作者进行分区,以使数据适合分区:

SELECT author
  , ROW_NUMBER() OVER(PARTITION BY REGEXP_EXTRACT(author, '.') ORDER BY created_utc)
FROM `fh-bigquery.reddit_comments.2017_06`

这个有效!现在,每一行都可以包含由first_letter_author + row_number组成的ID:

SELECT *
  , CONCAT(
      first_letter
      , '-'
      , CAST(ROW_NUMBER() 
      OVER(PARTITION BY REGEXP_EXTRACT(author, '.') 
      ORDER BY created_utc) AS STRING)) id
FROM (
  SELECT author, created_utc, REGEXP_EXTRACT(author, r'^.') first_letter
  FROM `fh-bigquery.reddit_comments.2017_06`
)