1
votes

Comment répertorier les tailles de toutes les tables de tous les ensembles de données dans Google Big Query

J'essaie de trouver comment répertorier toutes les tailles de toutes les tables dans tous les projets dans Google Big Query. Ce serait peut-être une Union SQL de plusieurs tables. Bien que je regarde BEAUCOUP de tableaux ici, j'aimerais donc une sorte de solution automatisée. Je pourrais utiliser le code R pour effectuer cette tâche. Ou j'utilise même froidement Python pour le faire. Si quelqu'un ici a une solution pour lister certaines métriques, principalement la taille de chaque objet (table), ainsi que d'autres métriques pertinentes, veuillez la partager ici. Merci beaucoup!


0 commentaires

3 Réponses :


-1
votes

Option 1

L'option actuelle pour ce faire consiste à utiliser l'API Google pour récupérer les informations sur les projets / ensemble de données / table et les stocker dans une table locale. Puisque vous avez mentionné que vous avez beaucoup de jeux de données et de tableaux, je vous suggère d'utiliser une approche sans serveur pour obtenir l'évolutivité et la vitesse de votre processus

List Project

Lister l'ensemble de données

List Table

Option 2

BigQuery propose désormais dans leur Programme bêta d’accès au schéma d’informations p>

select * from `project.__TABLES__`

Ou

select * from `DATASET.INFORMATION_SCHEMA.COLUMNS`

entrez la description de l'image ici

Opt ion 3 .

Vous pouvez interroger __TABLES__ pour obtenir des informations sur la table

select * from `DATASET.INFORMATION_SCHEMA.TABLES`

 entrez la description de l'image ici


2 commentaires

@ ryguy72 J'ai mis à jour un peu ma réponse pour refléter certaines nouvelles fonctionnalités disponibles pour vous dans BQ. Si quelque chose d'aide sera formidable si vous pouvez voter pour / accepter


select * from `project .__ TABLES__ Cela ne vous montre que toutes les tables dans un ensemble de données et le projet doit être remplacé par le nom de l'ensemble de données.



4
votes

Cet exemple en Python répertorie toutes les tables et leurs tailles en octets dans tous les projets. Vous pouvez le prendre comme exemple pour créer un script qui correspond à votre cas d'utilisation:

from google.cloud import bigquery
from google.cloud.bigquery import Dataset
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

# credentials to list project
credentials = GoogleCredentials.get_application_default()
service = discovery.build('cloudresourcemanager', 'v1', credentials=credentials)

# list project
request = service.projects().list()
response = request.execute()

# Main loop for project
for project in response.get('projects', []):
    client = bigquery.Client(project['projectId']) # Start the client in the right project

    # list dataset
    datasets = list(client.list_datasets())
    if datasets: # If there is some BQ dataset
        print('Datasets in project {}:'.format(project['name']))
        # Second loop to list the tables in the dataset
        for dataset in datasets: 
            print(' - {}'.format(dataset.dataset_id))
            get_size = client.query("select table_id, size_bytes as size from "+dataset.dataset_id+".__TABLES__") # This query retrieve all the tables in the dataset and the size in bytes. It can be modified to get more fields.
            tables = get_size.result() # Get the result
            # Third loop to list the tables and print the result
            for table in tables:
                print('\t{} size: {}'.format(table.table_id,table.size))

Référence:

Pour lister les projets:
https://cloud.google.com/ resource-manager / reference / rest / v1 / projects / list # embedded-explorer

Pour lister les ensembles de données:
https://cloud.google.com/bigquery/docs/ ensembles de données # bigquery-list-datasets-python


0 commentaires

2
votes

@Enle Lin J'ai en fait trouvé un problème avec votre code, car il ne gère pas les exceptions où l'API BigQuery d'un projet extrait n'a pas été activée et utilise la variable incorrecte pour name au lieu de projectId. J'ai donc modifié votre code et converti les octets en Gio (je pensais juste que c'était plus pertinent). Veuillez voir ci-dessous:

from google.cloud import bigquery
from google.cloud.bigquery import Dataset
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

#Leverage the Application Default Credentials for authentication
credentials = GoogleCredentials.get_application_default()
service = discovery.build('cloudresourcemanager', 'v1', credentials=credentials)

#List projects
request = service.projects().list()
response = request.execute()

#Main loop to list projects
for project in response.get('projects', []):
  try:
    client = bigquery.Client(project['projectId']) # Start the client in the right project

    #Loop to list datasets
    datasets = list(client.list_datasets())
    if datasets: # If there is some BQ dataset
        print('Datasets in project {}:'.format(project['projectId']))
        #Loop to list the tables in each dataset
        for dataset in datasets:
            print(' - {}'.format(dataset.dataset_id))
            get_sizeGiB = client.query("select table_id, (size_bytes /1073741824) as sizeGiB from "+dataset.dataset_id+".__TABLES__") # This query retrieves all the tables in the dataset and the size in GiB. It can be modified to pull more fields.
            tables = get_sizeGiB.result() # Get the result
            #Loop to list the tables and print the size
            for table in tables:
                print('\t{} sizeGiB: {}'.format(table.table_id,table.sizeGiB))
    else: print ('{} project does not contain any datasets.'.format(projectId))
  except Exception:
    pass


0 commentaires