将日期附加到 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
您可以使用以下逻辑来自动化您的流程:
每个月的第一天,检查是否有新文件到达。如果它在那里,将其内容添加到单独的 table(称之为 monthly_table
)。
每天,运行 合并 monthly_table
和 my_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
)标志。
我在 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
您可以使用以下逻辑来自动化您的流程:
每个月的第一天,检查是否有新文件到达。如果它在那里,将其内容添加到单独的 table(称之为
monthly_table
)。每天,运行 合并
monthly_table
和my_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
)标志。