如何使用 python API 在 bigquery 中创建新视图?
How can I create a new view in bigquery using the python API?
我有一些代码可以自动生成一堆不同的 SQL 查询,我想将这些查询插入到 bigquery 中以生成视图,尽管我遇到的一个问题是这些视图需要由于数据的性质不断变化,每晚都会动态生成。所以我想做的是使用 google bigquery api for python 来创建视图。我了解如何使用 'bq' 命令行工具来完成此操作,但我希望能够将其直接内置到代码中,而不是使用 shell 到 运行 bq .我玩过
提供的代码
https://cloud.google.com/bigquery/bigquery-api-quickstart
我不明白如何使用这段代码来创建视图而不只是返回 SELECT 语句的结果。我可以在此处
查看有关执行 table 插入的文档
https://cloud.google.com/bigquery/docs/reference/v2/tables/insert
但这指的是使用 REST API 生成新的 table,而不是上面提供的示例。
这不可能吗?我应该放弃并使用 bq 吗?
谢谢
*** 针对 Felipe 评论的一些补充问题。
table 资源文档指出有许多必填字段,其中一些是有意义的,即使我不完全理解他们的要求,其他的则不理解。例如,externalDataConfiguration.schema。这是指我正在连接的数据库的架构(我假设它是),还是用于存储数据的架构?
externalDataConfiguration.sourceFormat呢?由于我正在尝试查看预先存在的数据库,因此我不确定我是否了解源格式的相关性。它是我正在查看的数据库的源格式吗?我如何识别它?
AND externalDataConfiguration.sourceUris[],我没有将新数据导入数据库,所以我不明白这个(或前一个元素)是如何需要的。
模式呢?
tableReference.datasetId、tableReference.projectId 和 tableReference.tableId 是不言自明的。
Type 将是视图,view.query 将是用于生成视图的实际 sql 查询。所以我明白为什么制作视图需要这些,但我不明白其他部分。
你能帮我理解这些细节吗?
谢谢,
布拉德
web UI 或 bq 工具所做的一切都是通过 BigQuery API 完成的,所以不要放弃:)。
创建视图类似于创建 table,只是确保在调用 tables.insert()
时拥有包含视图 属性 的 table 资源。
使用https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/insert
提交如下内容,假设您添加了授权
{
"view": {
"query": "select column1, count(1) `project.dataset.someTable` group by 1",
"useLegacySql": false
},
"tableReference": {
"tableId": "viewName",
"projectId": "projectName",
"datasetId": "datasetName"
}
}
或者在 Python 中使用,假设您有服务密钥设置和环境变量 GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/key。需要注意的是,据我所知,这只能使用遗留 sql 创建视图,并且作为扩展只能使用遗留 sql 进行查询,尽管直接 API 方法允许传统或标准。
from google.cloud import bigquery
def create_view(dataset_name, view_name, project, viewSQL):
bigquery_client = bigquery.Client(project=project)
dataset = bigquery_client.dataset(dataset_name)
table = dataset.table(view_name)
table.view_query = viewSQL
try:
table.create()
return True
except Exception as err:
print(err)
return False
注意:这在库的 0.28.0 中略有变化 - 有关更多详细信息,请参阅以下内容:
我的示例函数
# create a view via python
def create_view(dataset_name, view_name, sqlQuery, project=None):
try:
bigquery_client = bigquery.Client(project=project)
dataset_ref = bigquery_client.dataset(dataset_name)
table_ref = dataset_ref.table(view_name)
table = Table(table_ref)
table.view_query = sqlQuery
table.view_use_legacy_sql = False
bigquery_client.create_table(table)
return True
except Exception as e:
errorStr = 'ERROR (create_view): ' + str(e)
print(errorStr)
raise
bigquery.版本 -> '1.10.0'
def create_view(client, dataset_name, view_name, view_query):
try:
dataset_ref = client.dataset(dataset_name)
view = dataset_ref.table(view_name)
# view.table_type = 'VIEW'
view.view_query = view_query
view.view_query_legacy_sql = False
client.create_table(view)
pass
except Exception as e:
errorStr = 'ERROR (create_view): ' + str(e)
print(errorStr)
raise
创建 table 而不是视图 !!!!
这是创建视图的正确代码:
def create_view(client, dataset_name, view_name, view_query):
try:
dataset_ref = client.dataset(dataset_name)
view_ref = dataset_ref.table(view_name)
table = bigquery.Table(view_ref)
table.view_query = view_query
table.view_use_legacy_sql = False
client.create_table(table)
except Exception as e:
errorStr = 'ERROR (create_view): ' + str(e)
print(errorStr)
raise
有必要
table = bigquery.Table(view_ref)
我有一些代码可以自动生成一堆不同的 SQL 查询,我想将这些查询插入到 bigquery 中以生成视图,尽管我遇到的一个问题是这些视图需要由于数据的性质不断变化,每晚都会动态生成。所以我想做的是使用 google bigquery api for python 来创建视图。我了解如何使用 'bq' 命令行工具来完成此操作,但我希望能够将其直接内置到代码中,而不是使用 shell 到 运行 bq .我玩过
提供的代码https://cloud.google.com/bigquery/bigquery-api-quickstart
我不明白如何使用这段代码来创建视图而不只是返回 SELECT 语句的结果。我可以在此处
查看有关执行 table 插入的文档https://cloud.google.com/bigquery/docs/reference/v2/tables/insert
但这指的是使用 REST API 生成新的 table,而不是上面提供的示例。
这不可能吗?我应该放弃并使用 bq 吗?
谢谢
*** 针对 Felipe 评论的一些补充问题。
table 资源文档指出有许多必填字段,其中一些是有意义的,即使我不完全理解他们的要求,其他的则不理解。例如,externalDataConfiguration.schema。这是指我正在连接的数据库的架构(我假设它是),还是用于存储数据的架构?
externalDataConfiguration.sourceFormat呢?由于我正在尝试查看预先存在的数据库,因此我不确定我是否了解源格式的相关性。它是我正在查看的数据库的源格式吗?我如何识别它?
AND externalDataConfiguration.sourceUris[],我没有将新数据导入数据库,所以我不明白这个(或前一个元素)是如何需要的。
模式呢?
tableReference.datasetId、tableReference.projectId 和 tableReference.tableId 是不言自明的。
Type 将是视图,view.query 将是用于生成视图的实际 sql 查询。所以我明白为什么制作视图需要这些,但我不明白其他部分。
你能帮我理解这些细节吗?
谢谢, 布拉德
web UI 或 bq 工具所做的一切都是通过 BigQuery API 完成的,所以不要放弃:)。
创建视图类似于创建 table,只是确保在调用 tables.insert()
时拥有包含视图 属性 的 table 资源。
使用https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/insert
提交如下内容,假设您添加了授权
{
"view": {
"query": "select column1, count(1) `project.dataset.someTable` group by 1",
"useLegacySql": false
},
"tableReference": {
"tableId": "viewName",
"projectId": "projectName",
"datasetId": "datasetName"
}
}
或者在 Python 中使用,假设您有服务密钥设置和环境变量 GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/key。需要注意的是,据我所知,这只能使用遗留 sql 创建视图,并且作为扩展只能使用遗留 sql 进行查询,尽管直接 API 方法允许传统或标准。
from google.cloud import bigquery
def create_view(dataset_name, view_name, project, viewSQL):
bigquery_client = bigquery.Client(project=project)
dataset = bigquery_client.dataset(dataset_name)
table = dataset.table(view_name)
table.view_query = viewSQL
try:
table.create()
return True
except Exception as err:
print(err)
return False
注意:这在库的 0.28.0 中略有变化 - 有关更多详细信息,请参阅以下内容:
我的示例函数
# create a view via python
def create_view(dataset_name, view_name, sqlQuery, project=None):
try:
bigquery_client = bigquery.Client(project=project)
dataset_ref = bigquery_client.dataset(dataset_name)
table_ref = dataset_ref.table(view_name)
table = Table(table_ref)
table.view_query = sqlQuery
table.view_use_legacy_sql = False
bigquery_client.create_table(table)
return True
except Exception as e:
errorStr = 'ERROR (create_view): ' + str(e)
print(errorStr)
raise
bigquery.版本 -> '1.10.0'
def create_view(client, dataset_name, view_name, view_query):
try:
dataset_ref = client.dataset(dataset_name)
view = dataset_ref.table(view_name)
# view.table_type = 'VIEW'
view.view_query = view_query
view.view_query_legacy_sql = False
client.create_table(view)
pass
except Exception as e:
errorStr = 'ERROR (create_view): ' + str(e)
print(errorStr)
raise
创建 table 而不是视图 !!!!
这是创建视图的正确代码:
def create_view(client, dataset_name, view_name, view_query):
try:
dataset_ref = client.dataset(dataset_name)
view_ref = dataset_ref.table(view_name)
table = bigquery.Table(view_ref)
table.view_query = view_query
table.view_use_legacy_sql = False
client.create_table(table)
except Exception as e:
errorStr = 'ERROR (create_view): ' + str(e)
print(errorStr)
raise
有必要
table = bigquery.Table(view_ref)