BigQuery - 检查表是否已存在

act*_*ner 12 export google-api google-cloud-storage google-bigquery

我在BigQuery中有一个数据集.该数据集包含多个表.

我正在使用BigQuery API以编程方式执行以下步骤:

  1. 查询数据集中的表 - 由于我的响应太大,我启用allowLargeResults参数并将响应转移到目标表.

  2. 然后,我将数据从目标表导出到GCS存储桶.

要求:

  • 假设我的流程在第2步失败,我想重新运行这一步.

  • 但在重新运行之前,我想检查/验证数据集中是否已存在名为"xyz"的特定目标表.

  • 如果存在,我想重新运行第2步.

  • 如果它不存在,我想做foo.

我怎样才能做到这一点?

提前致谢.

tar*_*eel 12

Alex F的解决方案适用于v0.27,但不适用于更高版本.为了迁移到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)
Run Code Online (Sandbox Code Playgroud)


Jor*_*ani 9

这是一个python片段,它将告诉表是否存在:

def doesTableExist(project_id, dataset_id, table_id):
  bq.tables().delete(
      projectId=project_id, 
      datasetId=dataset_id,
      tableId=table_id).execute()
  return False
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想在此过程中删除表,则可以尝试:

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
Run Code Online (Sandbox Code Playgroud)

如果您想知道bq来自哪里,可以build_bq_client在此处致电:http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py

通常,如果您使用它来测试是否应该运行一个将修改表的作业,那么最好还是完成这项工作,并将其WRITE_TRUNCATE用作写入处置.

另一种方法可以是创建可预测的作业ID,并使用该ID重试作业.如果作业已存在,则作业已经运行(您可能需要仔细检查以确保作业未发生故障).

  • 如果您已经有一个实例化的客户端,则有一个.exists()方法。请参阅我的回答/sf/answers/3351898021/ (2认同)