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
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.
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.
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