bigquery中的随机样本给出了不一致的结果

时间:2017-08-03 15:41:21

标签: google-bigquery

我使用bigquery中的AbstractEngine函数为我提供随机数据样本,并将其与同一数据集的另一个样本合并。 这是一个机器学习问题,我对一个课程比另一个课程感兴趣。

我使用公共数据集重新创建了逻辑。

RAND

大多数情况下,这表现得如预期的那样 给出一行SELECT COUNT(1), bigarticle FROM ( SELECT 1 as [bigarticle] FROM [bigquery-public-data:samples.wikipedia] WHERE num_characters > 50000 ), ( SELECT 0 as [bigarticle] FROM [bigquery-public-data:samples.wikipedia] WHERE (is_redirect is null) AND (RAND() < 0.01) ) GROUP BY bigarticle 超过50k的行数, 并给另一行计算1%的行样本,其中num_characters为空。 (这是我在内部数据集中使用的逻辑的近似值。)

如果您反复运行此查询,有时会产生意外结果。 在此结果集(is_redirect)中,我只获得一行,其中包含bquijob_124ad56f_15da8af982e = 1的计数。

1 个答案:

答案 0 :(得分:2)

RAND不使用确定性种子。如果需要确定性结果,则需要对表中的列进行散列/指纹,然后使用模数来选择值的子集。使用旧版SQL:

#legacySQL
SELECT
  COUNT(1),
  bigarticle
FROM (
  SELECT
    1 as [bigarticle]
  FROM [bigquery-public-data:samples.wikipedia]
  WHERE num_characters > 50000
), (
  SELECT 
    0 as [bigarticle]
  FROM [bigquery-public-data:samples.wikipedia]
  WHERE (is_redirect is null) AND HASH(title) % 100 = 0
)
GROUP BY bigarticle;

在BigQuery中使用标准SQL,因为旧版SQL不在积极开发中,所以建议使用标准SQL:

#standardSQL
SELECT
  COUNT(*),
  bigarticle
FROM (
  SELECT
    1 as bigarticle
  FROM `bigquery-public-data.samples.wikipedia`
  WHERE num_characters > 50000
  UNION ALL
  SELECT
    0 as bigarticle
  FROM `bigquery-public-data.samples.wikipedia`
  WHERE (is_redirect is null) AND MOD(FARM_FINGERPRINT(title), 100) = 0
)
GROUP BY bigarticle;