【问题标题】:Migrating Non Partitioned Streaming Table to Partitioned Table Bigquery将非分区流表迁移到分区表 Bigquery
【发布时间】:2018-09-20 02:50:48
【问题描述】:

我有一个遗留的未分区大查询表,可以流式传输来自各种来源的日志(比如说表BigOldA)。目的是将其转移到一个新的day 分区表(比如说PartByDay),这是在以下链接的帮助下完成的:

https://cloud.google.com/bigquery/docs/creating-column-partitions#creating_a_partitioned_table_from_a_query_result

bq query 
--allow_large_results 
--replace=true 
--destination_table <project>:<data-set>.<PartByDay>
--time_partitioning_field REQUEST_DATETIME 
--use_legacy_sql=false 'SELECT * FROM `<project>.<data-set>.<BigOldA>`'

我已将历史数据迁移到新表,但我无法在表BigOldA 中删除它们,因为我遇到了same problem,并且尚不支持在流缓冲表上运行 DML。

Error: UPDATE or DELETE DML statements are not supported over 
table <project>:<data-set>.BigOldA with streaming buffer

我计划每天运行批处理作业,将 T-1 数据从表 BigOldA 传输到表 PartByDay 并定期删除它们,以便我仍然可以维护表 BigOldA 中的流缓冲区数据并开始使用 @987654332 @ 分析表。现在我不确定它是否可以实现。

我正在寻找有关如何定期将流缓冲表传输和维护到分区表的替代解决方案或最佳实践。此外,由于数据是从独立的生产源流式传输的,因此不可能将所有源流指向PartByDaytables.getstreamingbuffer 属性永远不会为空。

【问题讨论】:

  • 可能我不太明白你的问题,或者我遗漏了一些东西,但是为什么你不能删除原始表,然后将迁移后的表重命名为原始名称运行你的历史工作? (这假设您的 BigQuery 流组件是容错的)。本质上,我不太明白:“我已将历史数据迁移到新表,但无法在 BigOldA 表中删除它们”
  • 不确定流组件是否完全容错并且绝对不准备在删除和重命名过程中丢失数据。此外,将数据流式传输到所写入的 bigquery 的应用程序和微服务会将按天表划分的分区视为相同,并开始将数据持久保存到新分区中而无需更改代码?
  • 如果设计得当,您应该不会丢失任何数据。无论是流式传输到 BigQuery 的内容,都应该能够存储事件,直到表重新联机。一旦表被分区,它不应该改变您正在流式传输的组件的任何内容。他们只看到同一张表,但在后台它现在已分区。也就是说,我还没有测试过,所以你应该;)
  • @GrahamPolley 你能添加你的评论作为答案吗?
  • @GrahamPolley 谢谢伙计.. 你建议的那个有效。只需检查重复项并将其删除

标签: google-bigquery


【解决方案1】:

如果有人对脚本感兴趣,请看这里。

#!/bin/sh
# This script
# 1. copies the data as the partitioned table
# 2. delete the unpartitioned table
# 3. copy the partitioned table to the same dataset table name
# TODO 4. deletes the copied table

set -e
source_project="<source-project>"
source_dataset="<source-dataset>"
source_table="<source-table-to-partition>"

destination_project="<destination-project>"
destination_dataset="<destination-dataset>"
partition_field="<timestamp-partition-field>"
destination_table="<table-copy-partition>"

source_path="$source_project.$source_dataset.$source_table"
source_l_path="$source_project:$source_dataset.$source_table"
destination_path="$destination_project:$destination_dataset.$destination_table"

echo "copying table from $source_path to $destination_path"
query=$(cat <<-END
SELECT * FROM \`$source_path\`
END
)

echo "deleting old table"
bq rm -f -t $destination_path
echo "running the query: $query"

bq query --quiet=true --use_legacy_sql=false --apilog=stderr --allow_large_results --replace=true --destination_table $destination_path --time_partitioning_field $partition_field "$query"

echo "removing the original table: $source_path"
bq rm -f -t $source_l_path
echo "table deleted"
echo "copying the partition table to the original source path"
bq cp -f -n $destination_path $source_l_path

【讨论】:

    【解决方案2】:

    您可以在运行历史记录作业后删除原始表,然后将迁移的表重命名为原始名称。这假设您的 BigQuery 流组件是容错的。如果设计得好,您不应该丢失任何数据。无论是流式传输到 BigQuery 的内容,都应该能够存储事件,直到表重新联机。一旦表被分区,它不应该改变您正在流式传输的组件的任何内容。

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多