是否可以使用 python 中的 bigquery API 将数据集中所有表的计数(*)发送到 csv 文件?
Posted
技术标签:
【中文标题】是否可以使用 python 中的 bigquery API 将数据集中所有表的计数(*)发送到 csv 文件?【英文标题】:It is possible to send the count(*) of all tables in a dataset to a csv file using bigquery API in python? 【发布时间】:2019-02-03 15:22:24 【问题描述】:我正在尝试使用 python 中的 bigquery API 获取给定项目的每个数据集的每个表的数据计数和不同计数,并将结果导出到 csv 文件。问题只是最后一个表的计数被发送到 csv 文件,需要将所有结果放入 csv 文件。如何进行此操作?(注意:在 bigquery 中已成功执行相同操作)
尝试在循环内尝试一个函数来返回查询结果并添加它但不成功,还尝试在同样失败的循环外打印 query_job 的结果。
from google.cloud import bigquery
import requests
import pandas as pd
from pandas import DataFrame
client = bigquery.Client.from_service_account_json
(r'C:\Users\username\Desktop\API.json ')
project = 'project_name'
def test_table_count(client):
dataset_ref = client.dataset(dataset_id, project=project)
table_ref = dataset_ref.table(table_id)
table = client.get_table(table_ref)
datasets = list(client.list_datasets())
for dataset in datasets:
tables = list(client.list_tables(dataset=dataset.reference))
print("Total_Table_Count ",len(tables))
for t in tables:
table_full_id = t.full_table_id
tt=table_full_id.replace(':','.')
t = tt.split('.')[2]
d = tt.split('.')[1]
query="Select '' Dataset, '' Table, count(*) Total_Count
FROM ``".format(d,t,tt)
df = pd.read_gbq(query, project_id='pro_id',dialect=
'standard',index_col=None, col_order=None, reauth=False,
verbose=True,private_key=None)
if df.shape[0]==0:
print('No records present in this dataset')
else:
print("df_content",df)
export_csv = df.to_csv (r'C:\path\datset_count1.csv', index =
None, header=True,sep=',')
预期:一个 csv 文件,其中包含每个表的 dataset_name、tabe_name、count()。 实际:来自给定项目中最后一个数据集的最后一个表的 daatset_name 、 table_name 和 count()。
【问题讨论】:
【参考方案1】:这里的问题是您每次都在覆盖 csv 文件。如果要附加结果,则必须在 df.to_csv
选项中添加 mode = 'a'
:
export_csv = df.to_csv (r'C:\path\datset_count1.csv', index =
None, header = True, mode = 'a', sep = ',')
请记住,这将打印每个表的标题,因此您可能需要设置header = False
,或者更好的是,第一次打印它们。例如,您可以在脚本的开头添加这一行:
is_first = True
然后在for
循环内写入时:
export_csv = df.to_csv (r'C:\path\datset_count1.csv', index =
None, header = is_first, mode = 'a', sep = ',')
is_first = False
header
选项将根据is_first
的值进行设置,对于第一项,它将仅为True
。
结果:
$ cat datset_count1.csv
Dataset,Table,Total_Count
dataset1,table1,12967
dataset1,table2,50
dataset1,table3,102
...
【讨论】:
以上是关于是否可以使用 python 中的 bigquery API 将数据集中所有表的计数(*)发送到 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 aws lambda 中使用 bigquery?
是否可以使用“$”装饰器访问标准 SQL 中的 BigQuery 分区?