BigQuery:将表插入到具有分片表的现有 Google 分析中

Posted

技术标签:

【中文标题】BigQuery:将表插入到具有分片表的现有 Google 分析中【英文标题】:BigQuery: insert table to an existing Google analytics with sharded table 【发布时间】:2020-05-05 11:35:52 【问题描述】:

我在 bigquery 中有一个现有的数据集 (A),其中 ga_sessions_YYYYMMDD(按日期分片)每天都通过谷歌分析填充。 我想做的是从具有相同模式的不同数据集(B)中插入数据。 例如,我有 ga_sessions_20200120 及更高版本,我想从数据集 (B) 中插入日期为 ga_sessions_20191201、20191202 的数据。我如何实现这一目标?由于我的数据集 (A) 中不存在 ga_sessions_20191201 表?

谢谢

【问题讨论】:

您是否尝试将表从数据集 B 移动到数据集 A? 我只想复制数据集A中不存在的表。 你要复制多少张表?是否有太多无法简单地做几个CREATE TABLE 查询? 我有至少 3 个月的 ga_sessions_YYYYMMDD 表 然后我将使用 BigQuery Data Transfer Service 数据集复制作业来执行此操作,它可以同步数据集并且仅跨目标表中不存在的表进行复制,听起来正是您需要的? cloud.google.com/bigquery/docs/copying-datasets 【参考方案1】:

如果您只想将一些特定日期表从 dataset_b 复制到 dataset_a,您可以在 Bash 脚本中使用 bq 命令,如下所示

d="20170708"
until [[ $d > 20170720 ]];
    do bq cp <dataset_b>.ga_sessions_$d <dataset_a>.ga_sessions_$s;
    d=$(date +'%Y%m%d' -d "$d + 1 day")
done

此脚本将从您在d 变量中定义的日期开始迭代日期,直到您在until 子句中定义的日期。 在每次迭代中,bq 命令都会将该日期的 ga_sessions 表从一个数据集复制到另一个数据集。

更新:

如果您想根据涉及其字段的条件复制表,可以使用bq query 为查询结果设置目标表:

date="20170708"
until [[ $date > 20170720 ]];
    do
    sql="SELECT "*" FROM <dataset_b>.ga_$date WHERE <your_condition>"
    dest="<dataset_a>.ga_sessions_$date"
    bq query --destination_table $dest -n=0 --use_legacy_sql=false "$sql";
    date=$(date +'%Y%m%d' -d "$date + 1 day")
done

【讨论】:

是否可以在此处添加 WHERE 条件? 你到底想做什么? 我有数据集 A,其中包含从 ga_sessions_20191201 到 ga_sessions_20200223 的数据,我想将其复制到数据集 B 中,该数据集 B 在数据集 A 的日期范围内缺少数据。但是,我需要使用主机名过滤器过滤掉数据集 A 中的数据。 您要根据表格的某个字段对其进行过滤吗? 是的,这是正确的。过滤器是 ga_sessions_YYYYMMDD 中的字段之一

以上是关于BigQuery:将表插入到具有分片表的现有 Google 分析中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 BigQuery 中的 WebUI 导出现有表的架构?

在 BigQuery 中将数据插入/创建分片/通配符表

Bigquery 分片与 Bigquery 分区

使用 bigquery 中的 bigquery select 语句的 JSON 格式的现有表的架构

在 Cloud SQL 中插入 bigquery 结果

无法将数据插入现有 BigQuery 表?