如何从现有表

时间:2018-02-02 11:16:49

标签: google-bigquery

我使用Big Query接口创建一个表。一张大桌子。我想用标准SQL(或传统SQL)语法导出该表的模式。

有可能吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

正如在this question中可以读到的那样,不可能这样做,并且有一个feature request来获取标准SQL查询的输出模式,但似乎没有最终实现。根据您的使用案例,除了使用bq之外,另一种解决方法是使用LIMIT 0进行查询。使用模式字段名称和类型立即返回结果(使用100B行表进行测试)。

了解这一点,您还可以使用您喜欢的脚本语言自动执行该过程。作为示例,我使用Cloud Shell作为CLI和API调用。它进行三次连续调用,其中first one执行查询并获得jobId(请求URL中不包含不必要的字段),then我们获取与该特定作业相对应的数据集和表ID, finally,检索架构。 我使用jq工具来解析Shell中预装的响应(manual),并将所有内容包装在shell function中:

result_schema()
{
QUERY=$1
authToken="$(gcloud auth print-access-token)"
projectId=$(gcloud config get-value project 2>\dev\null)

# get the jobId
jobId=$(curl  -H"Authorization: Bearer $authToken" \
              -H"Content-Type: application/json" \
              https://www.googleapis.com/bigquery/v2/projects/$projectId/queries?fields=jobReference%2FjobId \
              -d"$( echo "{
                \"query\": "\""$QUERY" limit 0\"",
                \"useLegacySql\": false
              }")" 2>\dev\null|jq -j .jobReference.jobId)

# get destination table
read -r datasetId tableId <<< $(curl -H"Authorization: Bearer $authToken" \
              "https://www.googleapis.com/bigquery/v2/projects/$projectId/jobs/$jobId?fields=configuration(query(destinationTable(datasetId%2CtableId)))" 2>\dev\null | jq -j '.configuration.query.destinationTable.datasetId, " " ,.configuration.query.destinationTable.tableId')

# get resulting schema
curl -H"Authorization: Bearer $authToken" https://www.googleapis.com/bigquery/v2/projects/$projectId/datasets/$datasetId/tables/$tableId?fields=schema 2>\dev\null | jq .schema.fields
}

然后我们可以通过查询100B行公共数据集来调用该函数(不要指定LIMIT 0,因为函数会自动添加它):

result_schema 'SELECT year, month, CAST(wikimedia_project as bytes) AS project_bytes, language AS lang FROM `bigquery-samples.wikipedia_benchmark.Wiki100B` GROUP BY year, month, wikimedia_project, language'

将以下输出作为模式(请注意使用强制转换和别名选择的字段来修改返回的模式):

[
  {
    "name": "year",
    "type": "INTEGER",
    "mode": "NULLABLE"
  },
  {
    "name": "month",
    "type": "INTEGER",
    "mode": "NULLABLE"
  },
  {
    "name": "project_bytes",
    "type": "BYTES",
    "mode": "NULLABLE"
  },
  {
    "name": "lang",
    "type": "STRING",
    "mode": "NULLABLE"
  }
]

使用UI创建新表时,可以在字段编辑器中复制/粘贴(或进一步自动化)此字段数组。

答案 1 :(得分:0)

我不确定如何使用StandardSQL或Legacy SQL语法。但是您可以使用命令行以json格式获取模式。

从这个link命令来做:

bq show --schema --format=prettyjson [PROJECT_ID]:[DATASET].[TABLE] > [PATH_TO_FILE]

答案 2 :(得分:0)

您可以使用此查询获取表的 DDL:

SELECT t.ddl
FROM `your_project.dataset.INFORMATION_SCHEMA.TABLES` t
WHERE t.table_name = 'your_table_name'
;