将日期附加到 table 并在数据可用后覆盖它 BigQuery Standard SQL

append dates to table and overwrite it once data is available BigQuery Standard SQL

我在 BigQuery 中有一个 my_table,每个月的第一天都会对其进行填充。数据如下所示:

date          rate    
01/01/22      1.5
01/02/22      1.4
...
01/31/22      1.7

2022 年 3 月 1 日,我将获得 2 月的数据(逐日)。但是,虽然 2 月的数据不可用,但我需要每天附加行 current_date 和 rate 列的空值,然后在 3 月 1 日数据可用后覆盖它。 期望的输出是:

date          rate    
01/01/22      1.5
01/02/22      1.4
...
01/31/22      1.7
02/01/22      null
02/02/22      null
...
02/17/22      null

您可以使用以下逻辑来自动化您的流程:

  1. 每个月的第一天,检查是否有新文件到达。如果它在那里,将其内容添加到单独的 table(称之为 monthly_table)。

  2. 每天,运行 合并 monthly_tablemy_table 的输出并用合并的输出覆盖 my_table 的查询。

对于 (#1),您可以 运行 从您的文件(假设它是 CSV)加载数据到 monthly_table 的命令。这可以使用 bq 命令行实用程序来完成,使用 --noreplace 标志以确保始终附加新数据:

bq load \
    --source_format=CSV \
    --skip_leading_rows=2 \
    --noreplace \
    mydataset.monthly_table \
    gs://mybucket/data_for_2022_02_01.csv \
    '[{"name": "date", "type": "STRING"}, {"name": "rate", "type": "FLOAT64"}]'

对于 (#2),您可以每天 运行 合并两个 table 的查询,然后用输出覆盖 my_table

select date, max(rate) as rate from (
   select date, rate from mydataset.monthly_table
      union all
   select date, rate from mydataset.my_table
      union all
   select format_date('%m/%d/%Y', current_date()) as date, null as rate 
)
group by date
order by date

您还可以使用 bq 实用程序来 运行 第二个查询(带有 --replace=true)标志。