我有一些代码会自动生成一堆不同的SQL查询,我想插入bigquery来生成视图,但我遇到的一个问题是这些视图需要每晚动态生成,因为数据的性质不断变化。所以我希望能够使用google bigquery api for python来创建视图。我知道如何使用' bq'命令行工具,但我希望能够将其直接构建到代码中,而不是使用shell来运行bq。我玩过
提供的代码https://cloud.google.com/bigquery/bigquery-api-quickstart
我不明白如何使用这段代码来创建视图,而不仅仅是返回SELECT语句的结果。我可以在这里看到关于进行表插入的文档
https://cloud.google.com/bigquery/docs/reference/v2/tables/insert
但是,这指的是使用REST API生成新表,而不是上面提供的示例。
这是不可能的吗?我应该放弃并使用bq吗?
由于
***针对费利佩的评论提出了一些其他问题。
表资源文档表明存在许多必填字段,即使我不完全理解他们要求的内容,其中一些字段也没有意义。例如,externalDataConfiguration.schema。这是指我要连接的数据库的模式(我假设它是什么),还是用于存储数据的模式?
externalDataConfiguration.sourceFormat怎么样?由于我试图查看预先存在的数据库,因此我不确定我是否了解源格式的相关性。它是我从中查看数据库的源格式吗?我该如何识别?
和externalDataConfiguration.sourceUris [],我没有将新数据导入数据库,所以我不明白这个(或前一个元素)是如何需要的。
架构怎么样?
tableReference.datasetId,tableReference.projectId和tableReference.tableId是不言自明的。
Type是view,view.query是用于制作视图的实际sql查询。所以我知道为什么这些是观看所必需的,但我不了解其他部分。
你能帮我理解这些细节吗?
谢谢, 布拉德
答案 0 :(得分:6)
使用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
答案 1 :(得分:3)
Web UI或bq工具所做的一切都是通过BigQuery API完成的,所以不要放弃:)。
创建视图类似于创建表,只需确保在调用tables.insert()
时拥有包含视图属性的表资源。
答案 2 :(得分:3)
注意:这改变了0.28.0的库 - 请参阅以下内容以获取更多详细信息: Google BigQuery: creating a view via Python google-cloud-bigquery version 0.27.0 vs. 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
答案 3 :(得分:0)
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
创建表而不是视图!!!!
这是创建视图的正确代码:
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)