我在BigQuery中有一个数据集。该数据集包含多个表。
我正在使用BigQuery API以编程方式执行以下步骤:
查询数据集中的表 - 由于我的响应太大,我启用了allowLargeResults参数并将响应转移到目标表。
然后我将数据从目标表导出到GCS存储桶。
要求:
假设我的流程在第2步失败,我想重新执行此步骤。
但在重新运行之前,我想检查/验证数据集中是否已存在名为“xyz”的特定目标表。
如果存在,我想重新开始第2步。
如果它不存在,我想做foo。
我该怎么做?
提前致谢。
答案 0 :(得分:9)
Alex F的解决方案适用于v0.27,但不适用于更高版本。为了migrate to v0.28+,以下解决方案将有效。
from google.cloud import bigquery
project_nm = 'gc_project_nm'
dataset_nm = 'ds_nm'
table_nm = 'tbl_nm'
client = bigquery.Client(project_nm)
dataset = client.dataset(dataset_nm)
table_ref = dataset.table(table_nm)
def if_tbl_exists(client, table_ref):
from google.cloud.exceptions import NotFound
try:
client.get_table(table_ref)
return True
except NotFound:
return False
if_tbl_exists(client, table_ref)
答案 1 :(得分:8)
这是一个python片段,用于判断表是否存在:
def doesTableExist(project_id, dataset_id, table_id):
bq.tables().delete(
projectId=project_id,
datasetId=dataset_id,
tableId=table_id).execute()
return False
或者,如果您不想删除流程中的表格,可以尝试:
def doesTableExist(project_id, dataset_id, table_id):
try:
bq.tables().get(
projectId=project_id,
datasetId=dataset_id,
tableId=table_id).execute()
return True
except HttpError, err
if err.resp.status <> 404:
raise
return False
如果您想知道bq
的来源,可以从此处致电build_bq_client
:http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py
一般情况下,如果你正在使用它来测试你是否应该运行一个会修改表的作业,那么最好还是完成这项工作,并使用WRITE_TRUNCATE
作为写处理。
另一种方法可以是创建可预测的作业ID,然后使用该ID重试作业。如果作业已经存在,则作业已经运行(您可能需要仔细检查以确保作业不会失败)。
答案 2 :(得分:1)
享受:
def doesTableExist(bigquery, project_id, dataset_id, table_id):
try:
bigquery.tables().get(
projectId=project_id,
datasetId=dataset_id,
tableId=table_id).execute()
return True
except Exception as err:
if err.resp.status != 404:
raise
return False
异常中有一个编辑。
答案 3 :(得分:0)
my_bigquery
是类google.cloud.bigquery.Client
的实例(已经过身份验证并与项目相关联):
my_bigquery.dataset(dataset_name).table(table_name).exists() # returns boolean
它通过GET请求进行API调用以测试表是否存在
使用0.27的Google Bigquery Python模块
对我有用答案 4 :(得分:0)
目前,tarheel的答案可能是最正确的
但是我正在考虑Ivan的评论,即“ 404也可能出于多种原因而意味着资源不存在”,因此,这里的解决方案应始终成功运行元数据查询并返回结果。
这不是最快的,因为它总是必须运行查询,而bigquery则需要进行小查询
我之前见过的一个技巧是查询information_schema
(一个表对象),然后union
到一个假查询,以确保即使该对象不返回记录也总是返回。 t。还有一个LIMIT 1
和一个排序,以确保返回的单个记录代表该表(如果存在)。请参见下面的代码中的SQL。
__table_summary__
__table_summary__
_TABLE_SUFFIX
,请参见https://cloud.google.com/bigquery/docs/querying-wildcard-tables之外)#!/usr/bin/env python
"""
Inline SQL way to check a table exists in Bigquery
e.g.
print(table_exists(dataset_name='<dataset_goes_here>', table_name='<real_table_name'))
True
print(table_exists(dataset_name='<dataset_goes_here>', table_name='imaginary_table_name'))
False
"""
from __future__ import print_function
from google.cloud import bigquery
def table_exists(dataset_name, table_name):
client = bigquery.Client()
query = """
SELECT table_exists FROM
(
SELECT true as table_exists, 1 as ordering
FROM __TABLES_SUMMARY__ WHERE table_id = @table_name
UNION ALL
SELECT false as table_exists, 2 as ordering
) ORDER by ordering LIMIT 1"""
query_params = [bigquery.ScalarQueryParameter('table_name', 'STRING', table_name)]
job_config = bigquery.QueryJobConfig()
job_config.query_parameters = query_params
if dataset_name is not None:
dataset_ref = client.dataset(dataset_name)
job_config.default_dataset = dataset_ref
query_job = client.query(
query,
job_config=job_config
)
results = query_job.result()
for row in results:
# There is only one row because LIMIT 1 in the SQL
return row.table_exists
答案 5 :(得分:0)
您现在可以使用exists()
检查数据集是否与表相同
BigQuery exist documentation