簡體   English   中英

使用 ARRAY_AGG + OffSet 查看不使用 BQ 表上的日期分區的好處

[英]View with ARRAY_AGG + OffSet not using the benefits of date partition on BQ table

我有一個由 kafka stream 數據加載的日期( createDt )分區 BQ 表。 我想 select 僅基於按ID列分組的updatedTime的最新記錄。 我可以通過這里提到的第二個頂級解決方案來實現它。 我想將其創建為視圖並通過以下代碼完成

create or replace view myView as 
SELECT row.* FROM (
  SELECT ARRAY_AGG(t ORDER BY updatedTime DESC LIMIT 1)[OFFSET(0)] AS row
  FROM `yourTable` AS t
  GROUP BY ID
) 

我注意到,如果我在 where 條件下使用分區日期列createDt查詢myView則會掃描整個基表,這是我不希望發生的。

但是,如果我創建一個普通視圖,例如

  create or replace view myNormalView as 
    SELECT * FROM  `yourTable`

然后查詢 using createDt ,僅掃描所需的分區並且讀取/計費的字節數非常少。

我的問題- 如何使分區在ARRAY_AGG(t ORDER BY updatedTime DESC LIMIT 1)[OFFSET(0)]之上工作。

我仍然是 BigQuery 的初學者。 任何建議/解決方案都非常感謝

事實證明,如果您將ARRAY_AGG(t ORDER BY updatedTime DESC LIMIT 1)[OFFSET(0)]單獨應用於所有列並 select 它們定義視圖,則分區列有效! 我也很幸運,因為一旦創建ID ,分區列createDt就不會改變。 所以我將它包含在group by中。 下面是解決方案,

Create view myView
SELECT ID,createDT, 
  ARRAY_AGG(col1 ORDER BY updatedTime DESC)[OFFSET(0)] AS col1,
  ARRAY_AGG(col2 ORDER BY updatedTime DESC)[OFFSET(0)] AS col2
FROM `yourTable`
GROUP BY ID,createDT

現在,如果我使用createDT作為過濾器查詢我的視圖,則只會讀取預期的分區。 我已經用大數據對其進行了測試,並且可以正常工作

注意:我很好奇,如果單獨在group by中添加分區列createDT是否可以解決問題,並在查詢中發布的.*查詢中嘗試了相同的操作。 但它仍然不起作用。 我想將ARRAY_AGG應用於每一列是必不可少的。 聽起來很傻,但就是這樣:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM