Можно отправить количество (*) всех таблиц в наборе данных в CSV-файл, используя API BigQuery в Python? - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь получить количество и отличное количество данных каждой таблицы каждого набора данных данного проекта, используя API BigQuery в Python, и экспортировать результат в CSV-файл.проблема только в том, что счетчик последней таблицы отправляется в CSV-файл, необходимо получить все результаты в CSV-файл.как это сделать? (Примечание: то же самое было успешно выполнено в большом запросе)

пытался попробовать функцию в цикле, чтобы вернуть результат запроса и добавить его, но безуспешно, также пытался распечататьрезультат запроса 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 с именем набора данных, именем tabe_name, количеством () каждой таблицы.Фактически: имя набора_данных, имя_таблицы и количество () из последней таблицы последнего набора данных в данном проекте.

1 Ответ

0 голосов
/ 03 февраля 2019

Проблема здесь только в том, что вы каждый раз перезаписываете файл csv.Если вы хотите добавить результаты, вы должны добавить mode = 'a' в df.to_csv опции:

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
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...