Google BigQuery报错:dataset必须为Dataset或DatasetReference求助
解决BigQuery中
TypeError: dataset must be a Dataset or a Dataset Reference的问题 先来说说你第一个代码的小问题:你用GBQ_client.list_datasets()得到的输出是<google.api_core.page_iterator.HTTPIterator object...>,这很正常——BigQuery的客户端方法返回的是分页迭代器,不是直接的数据集列表。要看到实际的数据集,你得遍历它才行,修改后的代码可以这样写:
from google.cloud import bigquery GBQ_client = bigquery.Client(project=config.PROJECT_ID) # 把迭代器转成列表,再遍历打印数据集ID datasets = list(GBQ_client.list_datasets()) for dataset in datasets: print(dataset.dataset_id)
接下来是你遇到的核心错误:TypeError: dataset must be a Dataset or a Dataset Reference。问题出在你给list_tables()传的参数格式不对——你用的是字符串'projectId:xxxxxxx',但这个方法要求的参数是Dataset对象或者DatasetReference对象,或者是正确格式的字符串。下面给你两种解决办法:
方法1:创建DatasetReference对象传入
先通过数据集ID生成一个DatasetReference实例,再传给list_tables(),代码示例:
from google.cloud import bigquery GBQ_client = bigquery.Client(project=config.PROJECT_ID) # 拆分你现有的冒号分隔字符串,创建DatasetReference project_id, dataset_id = config.Dataset_ID.split(':') dataset_ref = GBQ_client.dataset(dataset_id, project=project_id) # 或者如果已经知道项目ID,直接传数据集ID就行 # dataset_ref = GBQ_client.dataset('xxxxxxx', project=config.PROJECT_ID) # 现在调用list_tables就没问题了 tables = GBQ_client.list_tables(dataset_ref) # 遍历打印表名 for table in tables: print(table.table_id)
方法2:用正确格式的字符串直接传入
其实list_tables()也支持字符串参数,但要注意格式:
- 如果你的客户端已经指定了
project=config.PROJECT_ID,直接传数据集ID字符串'xxxxxxx'就行; - 如果要传完全限定名,得用点号分隔的
'project_id.dataset_id',而不是你之前用的冒号分隔格式。
代码示例:
from google.cloud import bigquery GBQ_client = bigquery.Client(project=config.PROJECT_ID) # 方式1:直接传数据集ID(客户端已指定项目) tables = GBQ_client.list_tables('xxxxxxx') # 方式2:传点号分隔的完全限定名 tables = GBQ_client.list_tables(f"{config.PROJECT_ID}.xxxxxxx") # 遍历打印表名 for table in tables: print(table.table_id)
简单来说,你之前的错误就是因为传入的字符串格式不符合要求,或者没有转成正确的对象类型,按照上面的方法修改就能解决啦。
内容的提问来源于stack exchange,提问作者Shivkumar kondi
相关产品推荐
相关产品推荐

