Cloud Storage-BigQuery传输服务能否配置动态data_path_template及相关疑问
问题解答
1. 配置data_path_template匹配上一小时文件
BigQuery Data Transfer Service支持通过时间通配符匹配基于调度时间的路径,结合你文件的<year>/<month>/<day>/<hour>/...层级结构,可利用内置时间变量动态生成上一小时的路径:
修改Terraform中的data_path_template如下:
data_path_template = "gs://${google_storage_bucket.sensor-data.name}/{YYYY}/{MM}/{DD}/{HH-1}/*/*.jsonl"
其中{YYYY}、{MM}、{DD}会自动替换为调度执行时的年月日,{HH-1}表示上一小时的小时数(例如调度在22:10执行时,会匹配21点目录下的所有文件)。
注意你的调度设置为every 1 hours from 00:10 to 23:10,这个时间点可以确保上一小时的文件已全部完成上传,避免漏加载。
2. 依赖文件最后修改时间避免重复加载
可以依赖该机制实现重复加载防护,官方规则明确:
从Cloud Storage发起的传输默认将写入偏好设置为APPEND模式。在此模式下,未修改的文件只能加载到BigQuery一次。如果文件的最后修改时间属性被更新,则会重新加载该文件。
具体逻辑:
- 文件上传后若不修改最后修改时间,即使传输任务重复执行,也不会重复加载同一文件
- 若需更新文件数据,只需修改文件的最后修改时间,传输服务会自动重新加载最新版本
3. 扫描成本与费用说明
- BigQuery Data Transfer Service本身免费,但Cloud Storage的操作会产生费用:
- 传输服务扫描匹配路径的文件属于Cloud Storage的类列表操作,会计入操作次数收费(按Cloud Storage定价标准执行)
- 通过精准的
data_path_template(仅匹配上一小时的目录)可大幅减少扫描文件数量,从而降低操作费用 - 即使Bucket总容量增长,只要路径匹配逻辑仅扫描固定小时的目录,扫描文件数不会随总容量线性增长,费用可控
修改后的完整Terraform配置
resource "google_bigquery_data_transfer_config" "query_config" { display_name = "sensor-data-ingestion" location = var.region data_source_id = "google_cloud_storage" schedule = "every 1 hours from 00:10 to 23:10" destination_dataset_id = google_bigquery_dataset.main.dataset_id params = { data_path_template = "gs://${google_storage_bucket.sensor-data.name}/{YYYY}/{MM}/{DD}/{HH-1}/*/*.jsonl" destination_table_name_template = "sensor_data_partitioned" file_format = "JSON" write_disposition = "WRITE_APPEND" } }
内容的提问来源于stack exchange,提问作者dain
相关产品推荐
相关产品推荐

