查找要插入 BigQuery 的列名

Posted

技术标签:

【中文标题】查找要插入 BigQuery 的列名【英文标题】:Find column names to insert into BigQuery 【发布时间】:2018-06-21 15:39:48 【问题描述】:

我正在尝试执行“插入表”,并看到我们需要明确指定列名。有没有办法在不手动输入的情况下获取这些数据?我正在 BigQuery 上执行此操作。

【问题讨论】:

【参考方案1】:

这是一个从表中获取列名(不产生成本)并同时构建INSERT 列表的示例:

WITH EmptyReference AS (
  SELECT *
  FROM `bigquery-public-data.samples.shakespeare`
  LIMIT 0
)
SELECT
  CONCAT(
    'INSERT dataset.tablename (',
    ARRAY_TO_STRING(
      REGEXP_EXTRACT_ALL(
        TO_JSON_STRING((SELECT AS STRUCT t.*)),
        r'"([^"]+)":'),
      ', '),
    ')')
FROM (
  SELECT AS VALUE t
  FROM EmptyReference AS t
  UNION ALL SELECT AS VALUE NULL
) AS t

这会返回:

INSERT dataset.tablename (word, word_count, corpus, corpus_date)     

June 2019 Update

现在支持在 INSERT 和 MERGE 语句中省略列名。

当省略列名时,目标表中的所有列都按照它们的序号位置升序包含

更多详情here

【讨论】:

完美运行!!非常感谢。 这个查询的哪一部分实际上只是获取列名? REGEXP_EXTRACT_ALL(TO_JSON_STRING(...)) 部分可以。您可以尝试删除部分查询以查看发生了什么。【参考方案2】:

使用INFORMATION_SCHEMA,Elliott 的查询可以重写为:

WITH ColumnNames AS (
  SELECT column_name FROM dataset.INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'tablename'
)
SELECT CONCAT(
  'INSERT dataset.tablename (',
  ARRAY_TO_STRING(ARRAY(SELECT column_name FROM ColumnNames), ', '),    
  ')');

【讨论】:

以上是关于查找要插入 BigQuery 的列名的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 如何在不使用列名作为值的情况下导入 CSV?

Dataproc + BigQuery 示例 - 有可用的吗?

BigQuery AEAD 功能的密钥集管理最佳实践 [关闭]

Google Cloud Dataproc 删除 BigQuery 表不起作用

如何使用在 Dataflow 执行期间计算的架构写入 BigQuery?

AppEngine BigQuery PHP 库在运行时不隐含?