2017-08-01 72 views
0

我有导入到Google Big Query中的表格。 这些表是我的登台表,我使用视图将登台表转换为逻辑仓库表。 我的问题是代理键。对谷歌Big Query使用Farm_fingerprint

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

我一直推荐使用FARM_FINGERPRINT

是否有聘请Surrogate_key代在大查询正确的方法是什么?

谢谢

更新1的澄清。

我的一些源表中有30个记录数百万个字段。要在这里显示大。我们正在将这些记录转换成需要创建代理键以便稍后帮助BI工具的表格。

为此,我们的视图(用来替换目标表)有了转换,再加上我们使用ROW_NUMBER()函数来创建独特的代理键。我们意识到该函数会强制Big Query将整个逻辑推送到一个节点上,从而导致查询崩溃。

我们玩弄FARM_FINGERPRINT(),使用表示唯一业务键的串联字段串作为输入来检索INT64值以用作代理键。我们的信念是,这将提供一个整数,我们可以在该工具所需的BI工具中使用该整数。

我在问的是,当你有这么大的数据集时,是否有合适的方法在Google Big Query中生成基于整数的代理键?

谢谢。

+0

如果你能提供更具体的例子将是(对你更好)比较容易回答。现在它太通用了! –

+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` 

This Works!现在,每行可以有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` 
) 
+0

嗨菲利普....非常感谢你的想法。我们抛弃了这一点,商业智能运营商告诉我们,在SK中包含字母会将字段从整数转换为字符串。在他们的系统中,字符串比较是不行的。喜欢这个主意。谢谢! – arcee123

+1

相同的策略将使用整数。不使用字符串,使用HASH()或任何数字可帮助您将数据分割成行,然后您可以使用ROW_NUMBER()OVER(PARTITION BY) –