2017-07-03 15 views
0

Bonjour ceci est une question 2 partieConfusion lors du téléchargement d'un JSON de stockage googlecloud à BigQuery

1) Actuellement, je suis en train de télécharger un fichier de stockage en nuage Google BigQuery via un script python. J'essaie de suivre les étapes indiquées par le site d'aide google.

https://cloud.google.com/bigquery/docs/loading-data-cloud-storage#bigquery-import-gcs-file-python

def load_data_from_gcs(dataset_name, table_name, source): 
    bigquery_client = bigquery.Client() 
    dataset = bigquery_client.dataset(dataset_name) 
    table = dataset.table(table_name) 
    job_name = str(uuid.uuid4()) 

    job = bigquery_client.load_table_from_storage(
     job_name, table, source) 

    job.begin() 

    wait_for_job(job) 

    print('Loaded {} rows into {}:{}.'.format(
     job.output_rows, dataset_name, table_name)) 

Je ne sais pas quoi mettre pour la première ligne de « load_data_from_gcs » parce que dans Google Cloud, il n'y a pas de tables, il est JSON Je suis en train de télécharger. Est-ce que la partie « table » soit le nom de la table, je suis en train de créer ou est-il parle du seau parce qu'il n'y a pas de partie pour spécifier quel seau je veux tirer de.

C'est le code que j'ai jusqu'à présent.

import json 
import argparse 
import time 
import uuid 

from google.cloud import bigquery 
# from google.cloud import storage 

def load_data_from_gcs('dataworks-356fa', table_name, 'pullnupload.json'): 
    bigquery_client = bigquery.Client('dataworks-356fa') 
    dataset = bigquery_client.dataset('FirebaseArchive') 
    table = dataset.table(table_name) 
    job_name = str(uuid.uuid4()) 

    job = bigquery_client.load_table_from_storage(
     job_name, table, source) 

    job.begin() 

    wait_for_job(job) 

    print('Loaded {} rows into {}:{}.'.format(
     job.output_rows, dataset_name, table_name)) 

partie 2) Je veux que ce script pour exécuter toutes les semaines et être en mesure soit de supprimer l'ancienne table et créer un nouveau ou soit filtre uniquement dans les données non-double. Celui qui est le plus facile.

Nous vous remercions de votre aide.

Répondre

1

Je ne sais pas quel est le problème que vous rencontrez, mais de charger des données à partir d'un fichier de GCS à BigQuery est exactement ce que vous faites déjà.

Si vous avez une table avec ce schéma:

[{"name": "id", "type": "INT64"}, {"name": "name", "type": "STRING"}] 

Et si vous avez ce fichier dans GCS (situé par exemple à "gs: //bucket/json_data.json"):

{"id": 1, "name": "test1"} 
{"id": 2, "name": "test2"} 

Il suffirait de maintenant définir l'objet job pour traiter un fichier JSON en entrée, comme ceci:

def load_data_from_gcs('dataworks-356fa', table_name, 'pullnupload.json'): 
    bigquery_client = bigquery.Client('dataworks-356fa') 
    dataset = bigquery_client.dataset('FirebaseArchive') 
    table = dataset.table(table_name) 
    job_name = str(uuid.uuid4()) 

    job = bigquery_client.load_table_from_storage(
     job_name, table, "gs://bucket/json_data.json") 

    job.source_format = 'NEWLINE_DELIMITED_JSON' 
    job.begin() 

Et je t.

(Si vous avez un fichier CSV, vous devez définir votre objet job en conséquence).

Quant à la deuxième question, il est vraiment une question de l'essayer différentes approches et de voir ce qui fonctionne le mieux pour vous.

Pour supprimer une table, il suffira d'avoir à courir:

table.delete() 

Pour supprimer des données dupliquées à partir d'une table une possibilité serait d'écrire une requête qui supprime la duplication et enregistre les résultats au même table. Quelque chose comme:

query_job = bigquery_client.run_async_query(query=your_query, job_name=job_name) 
query_job.destination = Table object 
query_job.write_disposition = 'WRITE_TRUNCATE' 
query_job.begin() 
+0

alors quand je l'exécute en python, il fonctionnera sans erreur mais n'exécutera rien. Aucune suggestion? –

+0

ce que vous voulez dire qu'il ne traite rien? le 'job.state' continue à' RUNNING'? –

+0

non il me retourne au terminal normal comme si le travail est terminé et ne montre aucune erreur, mais il n'y a pas de changement à mon google cloud ou bigquery –