Utilisez gcloud-python pour remplir BigQuery sans passer par GCS

Si vous souhaitez importer une petite quantité de données localement dans BigQuery sans passer par GCS, vous utilisez normalement la commande bq du SDK Google Cloud.

Cependant, lorsque j'ai pensé à Je veux télécharger automatiquement à partir du lot quotidien exécuté sur l'instance spot EC2, l'automatisation de la configuration du SDK Cloud et les paramètres d'authentification ont été définis. Je pense que c'est gênant de manière inattendue.

Avec le package gcloud de python, au moins l'automatisation de la configuration et les paramètres d'authentification étaient faciles, je vais donc laisser une note.

Google Cloud Python Client https://github.com/GoogleCloudPlatform/gcloud-python

Préparation

Paramètres du compte de service

Il est nécessaire de configurer un compte de service GCP et d'obtenir json pour l'authentification à l'avance.

Pour plus d'informations, recherchez simplement "Compte de service GCP", etc.

Installation du package gcloud

Il devrait venir en un seul coup avec pip.

pip install gcloud

Code

Enregistrez ce qui suit et exécutez-le avec python -u upload.py. Délimiteur de tabulation, la première ligne est en-tête, et si une table avec le même nom existe déjà, elle est définie pour être supprimée, veuillez donc la modifier comme il convient.

upload.py


from gcloud import bigquery
from gcloud.bigquery import SchemaField

json_key = '/my-folder/my-project-xxxxxxxxxxxx.json'
project_name = 'my-project-1234'
dataset_name = 'my-dataset'


def run():
    schema = [
        SchemaField('Col1', 'INTEGER', mode='required'),
        SchemaField('Col2', 'BOOLEAN', mode='required'),
        SchemaField('Col3', 'STRING', mode='nullable'),
        SchemaField('Col3', 'FLOAT', mode='nullable'),
    ]
    input_file_path = '/my-folder/input.txt'
    header_rows_to_skip = 1
    table_name = 'MyTable'
    csv_delimiter = '\t'
    delete_existing_table = True
    upload_one_csv_to_bq(input_file_path, csv_delimiter, header_rows_to_skip, table_name, schema, delete_existing_table)


def upload_one_csv_to_bq(local_csv_file_path, delimiter, header_rows_to_skip, 
                         table_name, table_schema, delete_existing_table):
    client = bigquery.Client.from_service_account_json(json_key, project=project_name)
    dataset = client.dataset(dataset_name)
    table = dataset.table(name=table_name)
    if delete_existing_table:
        if table.exists():
            print 'Delete existing table: ' + table_name
            table.delete()
    table.schema = table_schema
    table.create()
    with open(local_csv_file_path, 'rb') as file_obj:
        table.upload_from_file(file_obj, 'CSV', field_delimiter=delimiter, skip_leading_rows=header_rows_to_skip, ignore_unknown_values=False)
    print 'Done'


###########
# Entry Point
###########
if __name__ == "__main__":
    run()

Cela fonctionnait avec python 2.7.10 sur Amazon Linux 2016.03 et python 2.7.11 dans mes fenêtres. Vous pouvez utiliser UTF-8 même si les données incluent le japonais.

De côté

Au début, je le faisais en regardant ce qui suit qui est sorti de manière appropriée (section Insertion de données (synchrone)), mais cela fonctionne sur Windows, mais quand je l'apporte à EC2, c'est table.insert_data (rows) # API request Il y a une erreur désagréable comme "tuyau cassé".

https://googlecloudplatform.github.io/gcloud-python/stable/bigquery-usage.html

Donc, sous la forme d'utiliser table.upload_from_file après divers détours. Eh bien, si vous avez un problème, je recommande d'abandonner et de lire le code

https://github.com/GoogleCloudPlatform/gcloud-python/tree/master/gcloud/bigquery

Recommended Posts

Utilisez gcloud-python pour remplir BigQuery sans passer par GCS
Vider les tables BigQuery dans GCS à l'aide de Python