【问题标题】:partition big query LIMIT over date range在日期范围内划分大查询 LIMIT
【发布时间】:2021-10-20 11:04:56
【问题描述】:

我对 SQL 和大查询很陌生,所以这可能很简单。我正在对 BQ 中的公共数据集 GDELT 运行一些查询,并且对 LIMIT 有疑问。 GDELT 很大(14.4 TB),当我查询某些东西时,在这种情况下是一个人,我可以获得多达 100k 行或更多的结果,这种情况太多了。但是当我使用 LIMIT 时,它似乎并没有真正将结果平均分配在日期上,导致我得到非常随机的时间线。限制是如何工作的?有没有办法根据天数更均匀地获得结果?

SELECT DATE,V2Tone,DocumentIdentifier as URL, Themes, Persons, Locations
FROM `gdelt-bq.gdeltv2.gkg_partitioned`
WHERE DATE>=20210610000000 and _PARTITIONTIME >= TIMESTAMP(@start_date)
AND DATE<=20210818999999 and _PARTITIONTIME <= TIMESTAMP(@end_date)
AND LOWER(DocumentIdentifier) like @url_topic
LIMIT @limit

运行此查询并执行一些预处理时,我得到以下时间序列:

它基于 15k 个结果,但它们在几天内分布非常不均匀/随机(因为如果我不使用限制,总共有超过 500k 个结果)。我想做一个查询,将我的输出限制为 15k,但在几天内对数据进行平均分区。

【问题讨论】:

  • 粘贴文本而不是屏幕截图
  • 我还看到你的表是时间摄取分区的,我不太明白为什么日期列上还有过滤器?!

标签: sql google-bigquery sql-limit gdelt


【解决方案1】:

你需要排序,当你不排序你的结果时,返回结果的顺序是不能保证的:

但如果您希望每天获得相同数量的行数,您可以使用窗口函数:

select * from (
SELECT
    DATE,
    V2Tone,
    DocumentIdentifier as URL,
    Themes,
    Persons,
    Locations,
    row_number() over (partition by DATE) rn
FROM `gdelt-bq.gdeltv2.gkg_partitioned`
WHERE
    DATE >= 20210610000000 AND DATE <= 20210818999999
    and _PARTITIONDATE >= @start_date and _PARTITIONDATE <= @end_date
    AND LOWER(DocumentIdentifier) like @url_topic
) t where rn = @numberofrowsperday 

如果您只传递日期,则可以使用 _PARTITIONDATE 过滤分区。

【讨论】:

  • 但是我怎样才能得到一个偶数间隔的日期分区呢?如果我按日期排序,我只会得到前几个结果。由于数据集太大了,尽管过滤了 3 个月,但我只得到 3 天。 (请记住,如果可能的话,我宁愿不进行子查询以避免大量 BQ 成本)
  • @Jh123 您需要提供更多信息,编辑您的问题并添加示例数据和所需的输出。还可以删除屏幕截图并以文本模式粘贴您的代码
  • 我已经添加了我通过查询获得的数据图,它有点类似于问题stackoverflow.com/questions/24630635/…
  • @Jh123 所以如果我理解正确的话,您希望每天的行数有限但相同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多