是否可以使用 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 分区?

是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?

是否可以覆盖 BigQuery 中的分区?

使用 Python 的 BigQuery

在 bigquery 中更新表