Bonjour et merci de votre temps et de votre considération ... Je développe un bloc-notes Jupyter dans Google Cloud Platform/Datalab ... J'ai créé un Pandas DataFrame et souhaite écrire ce DataFrame à Google Cloud Storage (GCS) et/ou BigQuery. J'ai un compartiment dans GCS et j'ai, via le code suivant, créé les objets suivants:
import gcp
import gcp.storage as storage
project = gcp.Context.default().project_id
bucket_name = 'steve-temp'
bucket_path = bucket_name
bucket = storage.Bucket(bucket_path)
bucket.exists()
J'ai essayé diverses approches basées sur la documentation de Google Datalab, mais je continue à échouer. Merci.
Essayez l'exemple de travail suivant:
from datalab.context import Context
import google.datalab.storage as storage
import google.datalab.bigquery as bq
import pandas as pd
# Dataframe to write
simple_dataframe = pd.DataFrame(data=[{1,2,3},{4,5,6}],columns=['a','b','c'])
sample_bucket_name = Context.default().project_id + '-datalab-example'
sample_bucket_path = 'gs://' + sample_bucket_name
sample_bucket_object = sample_bucket_path + '/Hello.txt'
bigquery_dataset_name = 'TestDataSet'
bigquery_table_name = 'TestTable'
# Define storage bucket
sample_bucket = storage.Bucket(sample_bucket_name)
# Create storage bucket if it does not exist
if not sample_bucket.exists():
sample_bucket.create()
# Define BigQuery dataset and table
dataset = bq.Dataset(bigquery_dataset_name)
table = bq.Table(bigquery_dataset_name + '.' + bigquery_table_name)
# Create BigQuery dataset
if not dataset.exists():
dataset.create()
# Create or overwrite the existing table if it exists
table_schema = bq.Schema.from_data(simple_dataframe)
table.create(schema = table_schema, overwrite = True)
# Write the DataFrame to GCS (Google Cloud Storage)
%storage write --variable simple_dataframe --object $sample_bucket_object
# Write the DataFrame to a BigQuery table
table.insert(simple_dataframe)
J'ai utilisé this example et le fichier _table.py du site github datalab comme référence. Vous pouvez trouver d’autres fichiers de code source datalab
à l’adresse this link.
Utilisation de la documentation Google Cloud Datalab
import datalab.storage as gcs
gcs.Bucket('bucket-name').item('to/data.csv').write_to(simple_dataframe.to_csv(),'text/csv')
Mise à jour sur la réponse de @Anthonios Partheniou.
Le code est un peu différent maintenant - à partir du 29 novembre 2017
Passez un tuple contenant project_id
et dataset_id
à bq.Dataset
.
# define a BigQuery dataset
bigquery_dataset_name = ('project_id', 'dataset_id')
dataset = bq.Dataset(name = bigquery_dataset_name)
Passez un tuple contenant project_id
, dataset_id
et le nom de la table à bq.Table
.
# define a BigQuery table
bigquery_table_name = ('project_id', 'dataset_id', 'table_name')
table = bq.Table(bigquery_table_name)
# Create BigQuery dataset
if not dataset.exists():
dataset.create()
# Create or overwrite the existing table if it exists
table_schema = bq.Schema.from_data(dataFrame_name)
table.create(schema = table_schema, overwrite = True)
# Write the DataFrame to a BigQuery table
table.insert(dataFrame_name)
J'ai une solution un peu plus simple pour la tâche en utilisant Dask . Vous pouvez convertir votre DataFrame en Dask DataFrame, qui peut être écrit sur csv sur un stockage en nuage.
import dask.dataframe as dd
import pandas
df # your Pandas DataFrame
ddf = dd.from_pandas(df,npartitions=1, sort=True)
dd.to_csv('gs://YOUR_BUCKET/ddf-*.csv', index=False, sep=',', header=False,
storage_options={'token': gcs.session.credentials})
Depuis 2017, Pandas a une fonction Dataframe to BigQuery pandas.DataFrame.to_gbq
La documentation a un exemple:
import pandas_gbq as gbq
gbq.to_gbq(df, 'my_dataset.my_table', projectid, if_exists='fail')
Le paramètre if_exists
peut être réglé sur 'fail', 'replace' ou 'append'
Voir aussi cet exemple .
Je pense que vous devez le charger dans une variable d'octets et utiliser un %% storage write --variable $ sample_bucketpath (voir la documentation) dans une cellule séparée ... Je suis encore en train de le comprendre ... Mais c'est à peu près l'inverse de ce que je devais faire pour lire un fichier CSV, je ne sais pas si cela fait une différence en écriture, mais je devais utiliser BytesIO pour lire le tampon créé par la commande %% storage read ... Espérez-le aide, faites le moi savoir!