有没有办法将 BigQuery 表的架构导出为 JSON?

问题描述 投票:0回答:8

BigQuery table 具有可在 Web UI 中查看、更新 的架构,或用于使用 bq 工具以 JSON 文件形式

加载数据
。但是,我找不到将此架构从现有表转储到 JSON 文件的方法(最好是从命令行)。这可能吗?

json google-bigquery gcloud
8个回答
187
投票

一种将架构从现有表转储到 JSON 文件的方法(最好从命令行)。这可能吗?

尝试下面

bq show bigquery-public-data:samples.wikipedia  

您可以使用 –format 标志来美化输出

--格式:none|json|prettyjson|csv|sparse|pretty:

命令输出的格式。选项包括:

none:       ...
pretty:     formatted table output  
sparse:     simpler table output  
prettyjson: easy-to-read JSON format  
json:       maximally compact JSON  
csv:        csv format with header   

前三个旨在人类可读,后三个是 用于传递到另一个程序。如果未选择格式,则会选择一种格式 基于命令运行。

意识到我提供了部分答案:o)

下面是PO想要的

bq show --format=prettyjson bigquery-public-data:samples.wikipedia | jq '.schema.fields' 

126
投票

您可以添加标志

--schema
[1]以避免表数据信息。

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

bq show --schema --format=prettyjson myprojectid:mydataset.mytable > /tmp/myschema.json

[1] https://cloud.google.com/bigquery/docs/managing-table-schemas


47
投票
  1. 在 bq UI 上选择表。
  2. 选择您想要导出架构的列。
  3. 使用复制菜单将架构复制为 JSON。

table schema


15
投票

答案更新

自2020年10月起, 您还可以在

INFORMATION_SCHEMA.COLUMNS
上运行 SQL 查询,这是一种内省功能。

SELECT *
FROM <YOUR_DATASET>.INFORMATION_SCHEMA.COLUMNS

并使用聚合函数嵌套数据,例如

SELECT table_name, ARRAY_AGG(STRUCT(column_name, data_type)) as columns
FROM <YOUR_DATASET>.INFORMATION_SCHEMA.COLUMNS
GROUP BY table_name

如果您还需要视图中的源代码,

INFORMATION_SCHEMA.VIEWS
中还有有趣的元数据。

然后从 BigQuery 界面点击“保存结果/JSON”,或根据您的情况将其包装到

bq query
命令行中。

来源:BigQuery 发行说明


4
投票

您可以使用 REST API 调用来获取 JSON 格式的 BigQuery 表架构。文档链接:https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/get

curl 'https://bigquery.googleapis.com/bigquery/v2/projects/project-name/datasets/dataset-name/tables/table-name' \
     --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
     --header 'Accept: application/json' \
     --compressed

2
投票

截至 2022 年 5 月 15 日,此方法有效:

  1. 在谷歌云中,转到cloud shell
  2. 从 Cloud shell 的下拉菜单(左侧)中选择项目
  3. 使用以下命令 bq show --schema --format=prettyjson .

2
投票

以下 bash 脚本和 sql 总是帮助我解决从数据集中将所有表架构提取到 JSON 文件的问题:

#!/bin/bash
#gen-default-schema.sh
input=$1
source_type=$2
result=tables_${source_type}.result

bq query --format=csv --use_legacy_sql=false --flagfile=$input | awk '{if(NR>1)print}' > $result

while IFS= read -r line
do
    tbl_name=`echo "$line" | awk -F. '{print $NF}'`
    schema_file=`echo "$tbl_name" | cut -d'_' -f2-`.schema
    echo $schema_file
    bq show --schema --format=prettyjson $line > ./temp/${source_type}/${schema_file}
    echo "done"
done < "$result"

输入文件

example.sql
($1)

SELECT
  table_catalog || ":" || table_schema || "." || table_name
FROM (
  SELECT
    table_catalog,
    table_schema,
    table_name
  FROM
    `project-id`.<dataset_id>.INFORMATION_SCHEMA.TABLES
  ORDER BY
    table_name ASC )

运行:

$bash gen-default-schema.sh example.sql example

这会将所有 JSON 架构放在

./temp
文件夹下


0
投票

如果您想从谷歌

cloud-console
执行此操作,那么一个简短的
SQL
查询就可以实现这一点。

它将为您提供架构中的所有信息,您可以根据需要使用

https://cloud.google.com/bigquery/docs/information-schema-column-field-paths#schema
更改 STRUCT( ... ) .

或者将

INFORMATION_SCHEMA.<something>
与其他视图一起使用以获取 JSON 的不同元信息。

正如@Michel Hua在他们的回答中所说,在bigquery中选择

Query results -> JSON
以在运行SQL查询后获取JSON

SELECT table_name, ARRAY_AGG(STRUCT(column_name, data_type, description)) as columns
FROM `your-project-id`.your_dataset.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS 
WHERE table_name = 'your_table_name' 
GROUP BY table_name
© www.soinside.com 2019 - 2024. All rights reserved.