【问题标题】:Partition by week/month//quarter/year to get over the partition limit?按周/月//季度/年分区以超过分区限制?
【发布时间】:2019-10-01 03:55:53
【问题描述】:

我想将 32 年的数据放入分区表中。但是 BigQuery 说我超出了限制(4000 个分区)。

对于这样的查询:

CREATE TABLE `deleting.day_partition`
PARTITION BY FlightDate 
AS 
SELECT *
FROM `flights.original` 

我收到如下错误:

查询产生的分区太多,允许2000个,查询产生至少11384个分区

我怎样才能超过这个限制?

【问题讨论】:

    标签: google-bigquery database-partitioning


    【解决方案1】:

    您可以按周/月/年进行分区,而不是按天分区。

    在我的例子中,每年的数据包含大约 3GB 的数据,所以如果我按年分区,我将从集群中获得最大的好处。

    为此,我将创建一个year 日期列,并按它进行分区:

    CREATE TABLE `fh-bigquery.flights.ontime_201903`
    PARTITION BY FlightDate_year
    CLUSTER BY Origin, Dest 
    AS
    SELECT *, DATE_TRUNC(FlightDate, YEAR) FlightDate_year
    FROM `fh-bigquery.flights.raw_load_fixed`
    

    请注意,我在此过程中创建了额外的列 DATE_TRUNC(FlightDate, YEAR) AS FlightDate_year

    表格统计:

    Since the table is clustered, I'll get the benefits of partitioning即使我不使用分区列(年份)作为过滤器:

    SELECT *
    FROM `fh-bigquery.flights.ontime_201903`
    WHERE FlightDate BETWEEN '2008-01-01' AND '2008-01-10'
    
    Predicted cost: 83.4 GB
    Actual cost: 3.2 GB
    

    【讨论】:

    • 太糟糕了,它在过滤航班日期或范围时没有帮助,例如从 BI 工具向下钻取,因为 DATE_TRUNC() 不支持分区修剪 - 请参阅 issuetracker.google.com/issues/139939454
    • 你会为此写一个新的堆栈溢出问题吗?
    【解决方案2】:

    另一个示例,我创建了一个按站名聚集的 NOAA GSOD 汇总表 - 我没有按天进行分区,而是根本没有对其进行分区。

    假设我想为名称为SAN FRAN% 的所有电台查找自 1980 年以来最热的日子:

    SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
    FROM `fh-bigquery.weather_gsod.all` 
    WHERE name LIKE 'SAN FRANC%'
    AND date > '1980-01-01'
    GROUP BY 1,2
    ORDER BY active_until DESC
    

    请注意,我只处理了 55.2MB 的数据后得到了结果。

    源表上的等效查询(没有集群)改为处理 4GB:

    # query on non-clustered tables - too much data compared to the other one
    SELECT name, state, ARRAY_AGG(STRUCT(CONCAT(a.year,a.mo,a.da),temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(CONCAT(a.year,a.mo,a.da)) active_until
    FROM `bigquery-public-data.noaa_gsod.gsod*` a
    JOIN `bigquery-public-data.noaa_gsod.stations`  b
    ON a.wban=b.wban AND a.stn=b.usaf
    WHERE name LIKE 'SAN FRANC%'
    AND _table_suffix >= '1980'
    GROUP BY 1,2
    ORDER BY active_until DESC
    

    我还添加了一个地理聚集表,以按位置而不是站名进行搜索。在此处查看详细信息:https://stackoverflow.com/a/34804655/132438

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多