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!
3 Réponses :
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
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`
Opt ion 3 .
Vous pouvez interroger __TABLES__
pour obtenir des informations sur la table
select * from `DATASET.INFORMATION_SCHEMA.TABLES`
@ 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.
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
@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