【问题标题】:How to write big query to fetch varying number of columns across multiple tables如何编写大查询以跨多个表获取不同数量的列
【发布时间】:2019-09-18 13:30:31
【问题描述】:

我想编写一个大查询来从给定数据集中的多个表中获取列中的值。但是每个表中的列名是不同的,如 colA、colB、colC 等。如何做到这一点?

我的数据集中有许多表,其中一列包含网址。但是,此列名称在每个表中都不同。我想处理所有表的所有 URL。

我检查了这个链接How to combine multiple tables that vary slightly in columns。然而,它谈到了有限数量的列名变化和有限数量的表。

我知道

SELECT
column_name
FROM
`bq-project.bq-dataset.INFORMATION_SCHEMA.COLUMNS`
group by 1 

将给出不同的列,但不确定如何进行

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您可以创建一个视图来翻译列名。

    CREATE VIEW my_dataset.aggregated_tables AS
    SELECT * EXCEPT (colA), colA as url FROM table_a
    UNION
    SELECT * EXCEPT (colB), colB as url FROM table_b
    UNION
    SELECT * EXCEPT (colC), colC as url FROM table_c;
    

    【讨论】:

      【解决方案2】:

      为了好玩,使用 JS UDF 发现哪一列有 URL:

      CREATE TEMP FUNCTION urls(x STRING)
      RETURNS STRING
      LANGUAGE js AS r"""
        function isURL(str) {
          // https://stackoverflow.com/a/49185442/132438
          return /^(?:\w+:)?\/\/([^\s\.]+\.\S{2}|localhost[\:?\d]*)\S*$/.test(str); 
        }
      
        obj = JSON.parse(x);
        for (var key in obj){
          if(isURL(obj[key])) return(obj[key]);
        }
      """;
      
      WITH table_a AS (SELECT 'https://google.com/' aa)
      ,table_b AS (SELECT 'http://medium.com/@hoffa' ba, 'noturl' bb)
      ,table_c AS (SELECT 'bigquery' ca, 'noturl' cb, 'https://twitter.com/felipehoffa' cc)
      
      SELECT urls(x) url
      FROM (
        SELECT TO_JSON_STRING(t) x FROM table_a t
        UNION ALL
        SELECT TO_JSON_STRING(t) FROM table_b t
        UNION ALL
        SELECT TO_JSON_STRING(t) FROM table_c t
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-07
        • 2022-01-13
        • 1970-01-01
        • 2019-05-06
        • 2013-02-15
        • 2023-04-07
        • 2014-03-29
        相关资源
        最近更新 更多