2017-08-19 6 views
0

J'utilise google_cloud pour soumettre un travail à big query pour l'extraction du fichier à GCS comme ceci:Comment interroger un identifiant de travail particulier soumis à BigQuery une action

dataset = self.bqClient.dataset(self.website_id) 
table = dataset.table(table_name) 
job_name = str(uuid.uuid4()) 
job = self.bqClient.extract_table_to_storage(
job_name, table, destination) 
job.destination_format = "NEWLINE_DELIMITED_JSON" 
job.compression = 'GZIP' 
job.begin() 

Ici le travail id ou name est le uuid4. Fondamentalement, je suis la collecte de ces emplois ids dans un queue et je veux vérifier plus tard si ce job est en DONE état. Comment puis je faire ça?

J'ai été à la recherche de ceci mais jusqu'ici n'ai eu aucune chance. Je pouvais seulement trouver la fonction - client.list_jobs() mais c'est la liste de tous les jobs. Je veux seulement query ou search pour un particulier job.

Répondre

2

Vous pouvez tout simplement filtrer par l'attribut qui name emploi que vous voulez.

Disons que vous voulez obtenir des informations sur un emploi dont id est « grande chaîne de nom de la tâche 1 ». Vous pouvez filtrer à partir de la liste des tâches en cours d'exécution:

job_name = "big name string job 1" 
job = [job for job in list(self.bqClient.list_jobs()) if job.name == job_name][0] # this will break if list is empty 

print(job.state) # DONE or RUNNING 

Assurez-vous de mettre à jour le client si possible, actuellement, nous avons mangé la version 0.26.0

[EDIT]:

Vous avez dit dans votre commentaire sur avoir 1 million d'emplois. En ce qui concerne l'exécution de la méthode get job, actuellement l'API ne le fait que lors de l'exécution du exists et les méthodes reload donc il n'y a aucun moyen de courir quelque chose comme client.get_job(job_name).

Pourtant, dans le list_job, vous pouvez envoyer les arguments all_users et state_filter comme dans le code, quelque chose comme:

job_name = "big name string job 1" 
job = [job for job in list(self.bqClient.list_jobs(all_users=False, state_filter='done')) if job.name == job_name][0] 

, qui énumère les emplois uniquement pour l'utilisateur actuel autorisé dans le client avec l'état donné.

Si encore cette liste des millions, alors vous pouvez toujours (un peu solution « aki ») interroger directement à partir du constructeur de base de travail, quelque chose comme:

from google.cloud.bigquery.job import _AsyncJob 
job = _AsyncJob(job_name, self.bqClient) 
job.reload() 
print(job.state) #RUNNING or DONE 

Ce qui est une façon indirecte de l'exécution d'un client.get_job().

Cela pourrait être une demande de fonctionnalité intéressante pour le dépôt python.

+0

Sommes-nous s'il y a 1 million de travaux alors aussi cette option? –

+0

@NikhilParmar J'ai édité ma réponse avec de nouvelles informations –

+0

génial incroyable merci! laissez-moi essayer thesr et que vous sachiez –