首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从现有表生成表脚本

如何从现有表生成表脚本
EN

Stack Overflow用户
提问于 2018-02-02 11:16:48
回答 3查看 8.7K关注 0票数 8

我创建了一个具有大查询接口的表。一张大桌子。我想以Standard (或Legacy SQL)语法导出此表的架构。

有可能吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-03 12:51:16

由于可以在这个问题中读取,所以不可能这样做,并且有一个特征请求来获取标准SQL查询的输出模式,但它似乎没有最终实现。根据您的用例是什么,除了使用bq之外,另一个解决方法是使用LIMIT 0进行查询。结果将立即返回(用100B行表测试),其中包含架构字段名和类型。

知道了这一点,你也可以用你最喜欢的脚本语言自动化这个过程。例如,我使用Cloud作为CLI和API调用。它连续进行三次调用,其中第一个执行查询并获得一个jobId (请求URL中不包含不必要的字段),然后我们获得与该特定作业相对应的数据集和表ID,并检索模式最后。我使用jq工具解析响应(手册),该响应是在Shell中预装的,并将所有内容封装在壳函数中。

代码语言:javascript
复制
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,因为该函数会自动添加它):

代码语言:javascript
复制
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'

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

代码语言:javascript
复制
[
  {
    "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创建新表时,可以在字段编辑器中复制/粘贴(或进一步自动化)这个字段数组。

票数 3
EN

Stack Overflow用户

发布于 2021-07-13 01:56:12

您可以通过以下查询获得表的DDL:

代码语言:javascript
复制
SELECT t.ddl
FROM `your_project.dataset.INFORMATION_SCHEMA.TABLES` t
WHERE t.table_name = 'your_table_name'
;
票数 9
EN

Stack Overflow用户

发布于 2018-02-02 18:41:38

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

在这个链接中,执行它的命令是:

代码语言:javascript
复制
bq show --schema --format=prettyjson [PROJECT_ID]:[DATASET].[TABLE] > [PATH_TO_FILE]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48581547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档