小智 12
您可以使用以下查询获取表的 DDL:
SELECT t.ddl
FROM `your_project.dataset.INFORMATION_SCHEMA.TABLES` t
WHERE t.table_name = 'your_table_name'
;
Run Code Online (Sandbox Code Playgroud)
正如在这个问题中可以看到的那样,这是不可能的,并且有一个功能请求来获取标准 SQL 查询的输出模式,但似乎它最终没有实现。根据您的用例,除了使用 之外bq,另一个解决方法是使用 进行查询LIMIT 0。结果立即返回(使用 100B 行表进行测试)以及架构字段名称和类型。
了解这一点后,您还可以使用您最喜欢的脚本语言来自动化该过程。作为示例,我使用 Cloud Shell 作为 CLI 和 API 调用。它会进行三个连续的调用,其中第一个执行查询并获取 jobId(请求 URL 中不包含不必要的字段),然后我们获取与该特定作业相对应的数据集和表 ID,最后检索模式。我使用该jq工具来解析响应(手动),该工具预装在 Shell 中,并将所有内容包装在shell 函数中:
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
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以通过查询 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'
Run Code Online (Sandbox Code Playgroud)
使用以下输出作为架构(注意使用强制转换和别名来修改返回的架构的选定字段):
[
{
"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"
}
]
Run Code Online (Sandbox Code Playgroud)
然后,当使用 UI 创建新表时,可以在字段编辑器中复制/粘贴(或进一步自动化)该字段数组。
| 归档时间: |
|
| 查看次数: |
12744 次 |
| 最近记录: |