Google bigquery 在BigQuery中合并具有不同模式的多个表

Google bigquery 在BigQuery中合并具有不同模式的多个表,google-bigquery,Google Bigquery,合作伙伴每天向我们的BigQuery DW推送一个表,其中包含以下结构虚拟名称: 表格名称:条目_2020_06_16、条目_2020_06_17、条目_2020_06_18。。。条目(2022)(12)(31) 模式:第1列、第2列、第3列,上校 这里重要的是,每日文件中的列数不同。 在表项_2020_06_16中,它可能来自第1列、第2列。。。上校149。 在表项_2020_06_17中,它可能来自第1列、第2列。。。上校23 我希望合并这些文件,这样就不会丢失任何数据,并且将缺少的值设置为

合作伙伴每天向我们的BigQuery DW推送一个表,其中包含以下结构虚拟名称:

表格名称:条目_2020_06_16、条目_2020_06_17、条目_2020_06_18。。。条目(2022)(12)(31) 模式:第1列、第2列、第3列,上校

这里重要的是,每日文件中的列数不同。 在表项_2020_06_16中,它可能来自第1列、第2列。。。上校149。 在表项_2020_06_17中,它可能来自第1列、第2列。。。上校23

我希望合并这些文件,这样就不会丢失任何数据,并且将缺少的值设置为null。此外,它需要是动态的,并且应该在BigQuery环境中运行

不幸的是,from entry_*技巧不起作用,因为它会删除并非所有表都通用的列

在下面的示例中,我希望得到一个如下所示的表: 列:列1、列2、列3 第1行:x、y、z 第2行:a、b、空

create or replace table temp.entry_2020_06_10 as select "x" as col_1, "y" as col_2, "z" as col_3
create or replace table temp.entry_2020_06_11 as select "a" as col_1, "b" as col_2
select * from `temp.entry_20*` 

有什么创意吗

您可以使用带有execute immediate的INFORMATION_SCHEMA.COLUMNS生成动态查询:

execute immediate  (SELECT
  string_agg(CONCAT('select ',columns,' from `project-id.dataset-id.',table_name,'`'),'\nUnion all\n')
FROM (
  SELECT
    table_column.table_name,
    STRING_AGG(CASE
        WHEN x.column_name IS NULL THEN CONCAT('null as ',table_column.column_name)
      ELSE
      table_column.column_name
    END
      ,', '
    ORDER BY
      table_column.column_name) columns
  FROM (
    SELECT
      tables.table_name,
      columns.column_name
    FROM (
      SELECT
        DISTINCT column_name
      FROM
        `project-id.dataset-id.INFORMATION_SCHEMA.COLUMNS` a where table_name like 'entry_%') columns
    FULL OUTER JOIN (
      SELECT
        DISTINCT table_name
      FROM
        `project-id.dataset-id.INFORMATION_SCHEMA.COLUMNS` b where table_name like 'entry_%') tables
    ON
      (1=1)) table_column
  LEFT JOIN
    `project-id.dataset-id.INFORMATION_SCHEMA.COLUMNS` x
  ON
    (x.table_name = table_column.table_name
      AND x.column_name = table_column.column_name)
  GROUP BY
    1 )) ;

您可以将INFORMATION_SCHEMA.COLUMNS与execute immediate一起使用以生成动态查询:

execute immediate  (SELECT
  string_agg(CONCAT('select ',columns,' from `project-id.dataset-id.',table_name,'`'),'\nUnion all\n')
FROM (
  SELECT
    table_column.table_name,
    STRING_AGG(CASE
        WHEN x.column_name IS NULL THEN CONCAT('null as ',table_column.column_name)
      ELSE
      table_column.column_name
    END
      ,', '
    ORDER BY
      table_column.column_name) columns
  FROM (
    SELECT
      tables.table_name,
      columns.column_name
    FROM (
      SELECT
        DISTINCT column_name
      FROM
        `project-id.dataset-id.INFORMATION_SCHEMA.COLUMNS` a where table_name like 'entry_%') columns
    FULL OUTER JOIN (
      SELECT
        DISTINCT table_name
      FROM
        `project-id.dataset-id.INFORMATION_SCHEMA.COLUMNS` b where table_name like 'entry_%') tables
    ON
      (1=1)) table_column
  LEFT JOIN
    `project-id.dataset-id.INFORMATION_SCHEMA.COLUMNS` x
  ON
    (x.table_name = table_column.table_name
      AND x.column_name = table_column.column_name)
  GROUP BY
    1 )) ;

非常感谢。工作完美。我不知道信息模式中的元数据信息。即使我发现一个类似的SQL也会导致我头发花白。很抱歉格式化,我似乎无法格式化注释。啊,忘了一部分:我需要将结果保存到新表中。我尝试将新表定义添加到字符串中,如下所示:string_aggCONCAT'create or replace table project-id.dataset-id.table_name'as select',columns',from project-id.dataset-id',table_name,,'\n全部\n'。但它返回错误:错误:无效的执行立即sql字符串create或replace table temp.a as select…create或replace语句应该在内部查询之外的查询中,因此您不需要create table union all create TABLESECT concat“create or replace table project-id.dataset-id.table_name as”,查询来自选择字符串“\u aggcont”“SELECT”,列,“from-project-id.dataset-id.”,表名称,“\n全部\n”查询谢谢!工作完美。我不知道信息模式中的元数据信息。即使我发现一个类似的SQL也会导致我头发花白。很抱歉格式化,我似乎无法格式化注释。啊,忘了一部分:我需要将结果保存到新表中。我尝试将新表定义添加到字符串中,如下所示:string_aggCONCAT'create or replace table project-id.dataset-id.table_name'as select',columns',from project-id.dataset-id',table_name,,'\n全部\n'。但它返回错误:错误:无效的执行立即sql字符串create或replace table temp.a as select…create或replace语句应该在内部查询之外的查询中,因此您不需要create table union all create TABLESECT concat“create or replace table project-id.dataset-id.table_name as”,从SELECT string_aggCONCAT'SELECT',columns',from project-id.DATASE-id',table_name,,'\nUnion all\n'查询中进行查询