如何使用 python API 在 bigquery 中创建新视图?
Posted
技术标签:
【中文标题】如何使用 python API 在 bigquery 中创建新视图?【英文标题】:How can I create a new view in bigquery using the python API? 【发布时间】:2015-10-20 17:49:13 【问题描述】:我有一些代码可以自动生成一堆不同的 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 吗?
谢谢
*** 针对 Felipe 的 cmets 的一些附加问题。
表格资源文档表明有许多必填字段,其中一些是有意义的,即使我不完全理解他们的要求,而另一些则没有。例如,externalDataConfiguration.schema。这是指我正在连接的数据库的架构(我假设它是),还是用于存储数据的架构?
externalDataConfiguration.sourceFormat 呢?由于我正在尝试查看预先存在的数据库,因此我不确定我是否了解源格式的相关性。它是我从中创建视图的数据库的源格式吗?我如何识别它?
和 externalDataConfiguration.sourceUris[],我没有将新数据导入数据库,所以我不明白这个(或之前的元素)是如何需要的。
架构呢?
tableReference.datasetId、tableReference.projectId 和 tableReference.tableId 是不言自明的。
类型是视图,view.query 是用于创建视图的实际 sql 查询。所以我明白为什么制作视图需要这些,但我不明白其他部分。
你能帮我理解这些细节吗?
谢谢, 布拉德
【问题讨论】:
【参考方案1】:使用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
【讨论】:
现在可以通过 view_use_legacy_sql 方法使用标准 SQL,例如:table.view_query = viewSQL table.view_use_legacy_sql = False 这似乎不再起作用了,我得到AttributeError: 'TableReference' object has no attribute 'create'
【参考方案2】:
注意:这与库的 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】:Web UI 或 bq 工具所做的一切都是通过 BigQuery API 完成的,所以不要放弃 :)。
创建视图类似于创建表,只需确保在调用tables.insert()
时拥有包含视图属性的表资源即可。
【讨论】:
谢谢,我不确定我是否在追逐一些永远不会成功的东西。我有一些更具体的问题,但我会将它们添加到原始帖子中。 使用bq
工具创建视图,但使用--apilog
选项。这将准确显示调用中使用了哪些参数。
太棒了,我明天回去工作时试试这个。
如何创建 etag?它说这是“此资源的哈希”,但我不明白这是什么意思。它只是我在客户端生成的随机生成的哈希码,还是需要其中的特定内容?
你没有,它说[仅输出]【参考方案4】:
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)
【讨论】:
谢谢!我面临的第一个问题是无论如何,我的代码都会创建一个表而不是视图,然后我看到了你的答案。以上是关于如何使用 python API 在 bigquery 中创建新视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google BigQuery 的记录中查询字符串?文档不工作
如何使用 ctypes 在 python 中正确包装 C API?