【问题标题】:Bigquery query to find the column names of a tableBigquery 查询以查找表的列名
【发布时间】:2012-07-05 12:33:45
【问题描述】:

我需要一个查询来在 Bigquery 中查找表(表元数据)的列名,如 SQL 中的以下查询:

SELECT column_name,data_type,data_length,data_precision,nullable FROM all_tab_cols where table_name ='EMP';

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    是的,您可以使用INFORMATION_SCHEMA 获取表元数据。

    上一个链接中提到的示例之一从 github_repos 数据集中的提交表的 INFORMATION_SCHEMA.COLUMN_FIELD_PATHS 视图中检索元数据,您只需

    1. 在 GCP Console 中打开 BigQuery 网页界面。

    2. 在查询编辑器框中输入以下标准 SQL 查询。 INFORMATION_SCHEMA 需要标准的 SQL 语法。标准 SQL 是 GCP Console 中的默认语法。

       SELECT
        *
       FROM
        `bigquery-public-data`.github_repos.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS
       WHERE
        table_name="commits"
        AND column_name="author"
        OR column_name="difference"
      

    注意:INFORMATION_SCHEMA 视图名称区分大小写。

    1. 点击运行。

    结果应如下所示

      +------------+-------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
      | table_name | column_name |     field_path      |                                                                      data_type                                                                      | description |
      +------------+-------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
      | commits    | author      | author              | STRUCT<name STRING, email STRING, time_sec INT64, tz_offset INT64, date TIMESTAMP>                                                                  | NULL        |
      | commits    | author      | author.name         | STRING                                                                                                                                              | NULL        |
      | commits    | author      | author.email        | STRING                                                                                                                                              | NULL        |
      | commits    | author      | author.time_sec     | INT64                                                                                                                                               | NULL        |
      | commits    | author      | author.tz_offset    | INT64                                                                                                                                               | NULL        |
      | commits    | author      | author.date         | TIMESTAMP                                                                                                                                           | NULL        |
      | commits    | difference  | difference          | ARRAY<STRUCT<old_mode INT64, new_mode INT64, old_path STRING, new_path STRING, old_sha1 STRING, new_sha1 STRING, old_repo STRING, new_repo STRING>> | NULL        |
      | commits    | difference  | difference.old_mode | INT64                                                                                                                                               | NULL        |
      | commits    | difference  | difference.new_mode | INT64                                                                                                                                               | NULL        |
      | commits    | difference  | difference.old_path | STRING                                                                                                                                              | NULL        |
      | commits    | difference  | difference.new_path | STRING                                                                                                                                              | NULL        |
      | commits    | difference  | difference.old_sha1 | STRING                                                                                                                                              | NULL        |
      | commits    | difference  | difference.new_sha1 | STRING                                                                                                                                              | NULL        |
      | commits    | difference  | difference.old_repo | STRING                                                                                                                                              | NULL        |
      | commits    | difference  | difference.new_repo | STRING                                                                                                                                              | NULL        |
      +------------+-------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
    

    【讨论】:

    • INFORMATION_SCHEMA.COLUMN_FIELD_PATHS 正是我所需要的。谢谢你!
    【解决方案2】:

    BigQuery 现在支持信息架构。

    假设您有一个名为 MY_PROJECT.MY_DATASET 的数据集和一个名为 MY_TABLE 的表,那么您可以运行以下查询:

    SELECT column_name
    FROM MY_PROJECT.MY_DATASET.INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'MY_TABLE'
    

    【讨论】:

    • 你知道为什么这个查询需要 3m+ 才能在我的一个数据集上运行吗?数据集中的表不多,表也不大。但是 3m+ 使它在我的应用程序中无法使用。感谢您的帮助!
    【解决方案3】:

    更新:现在可以实现了!请参阅INFORMATION SCHEMA docs 和下面的答案。

    答案,大约在 2012 年:

    目前无法通过查询检索表元数据(即列名和类型),但这不是第一次被请求。

    您是否有理由需要将此作为查询?表元数据可通过tables API 获得。

    【讨论】:

    • 感谢 Craig,tables API 足以让我获取表元数据。
    • 我个人希望它可以作为查询完成的原因是因为我的项目以前就是这样做的,并且在移动过程中必须学习和转换的功能将减少一个一切都结束了。
    • newer answer 可以为您提供一些关于如何通过标准 SQL 查询执行此操作的想法。
    • 这个答案是错误的,至少目前是这样。见右下角。
    【解决方案4】:

    要检查列,您可以通过 CLI 轻松访问您的表格

    bq query --use_legacy_sql=false 'select Hour, sum(column 1) as column from `project_id.dataset.table_name` where Date(Hour) = '2020-06-10';'
    

    【讨论】:

      【解决方案5】:

      对于像我这样的新手,上面的语法如下:

      select * from project_name.dataset_name.INFORMATION_SCHEMA.COLUMNS where table_catalog=project_name and table_schema=dataset_name and table_name=table_name
      

      【讨论】:

      • 我强烈建议您使用“SQL”标记您的问题。还可以查看查询的格式,使其更易于阅读。
      【解决方案6】:

      实际上使用 SQL 可以做到这一点。为此,您需要在日志表中查询正在创建的该特定表的最后一个日志。

      例如,假设每天都加载/创建表:

          CREATE TEMP FUNCTION jsonSchemaStringToArray(jsonSchema String)
                RETURNS ARRAY<STRING> AS ((
                  SELECT
                    SPLIT(
                      REGEXP_REPLACE(REPLACE(LTRIM(jsonSchema,'{ '),'"fields": [',''), r'{[^{]+"name": "([^\"]+)"[^}]+}[, ]*', '\\1,')
                    ,',')
                ));
          WITH valid_schema_columns AS (
            WITH array_output aS (SELECT
              jsonSchemaStringToArray(jsonSchema) AS column_names
            FROM (
              SELECT
                protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.schemaJson AS jsonSchema
                , ROW_NUMBER() OVER (ORDER BY metadata.timestamp DESC) AS record_count
              FROM `realself-main.bigquery_logging.cloudaudit_googleapis_com_data_access_20170101`
              WHERE
                protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.destinationTable.tableId = '<table_name>'
                AND
                protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.destinationTable.datasetId = '<schema_name>'
                AND
                protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.createDisposition = 'CREATE_IF_NEEDED'
            ) AS t
            WHERE
              t.record_count = 1 -- grab the latest entry
            )
            -- this is actually what UNNESTS the array into standard rows
            SELECT
              valid_column_name
            FROM array_output
            LEFT JOIN UNNEST(column_names) AS valid_column_name
      
          )
      

      【讨论】:

      • 我们在哪里插入我们的表名?鉴于上面的评论指的是一个更短的 SQL 示例,因此显然有一个更简单的版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2017-12-13
      相关资源
      最近更新 更多