web-dev-qa-db-fra.com

Écrire un DataFrame Pandas sur Google Cloud Storage ou BigQuery

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.

14
EcoWarrior

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.

10

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')
11
Jan Krynauw

Écrire un DataFrame Pandas dans BigQuery

Mise à jour sur la réponse de @Anthonios Partheniou.
Le code est un peu différent maintenant - à partir du 29 novembre 2017

Pour définir un jeu de données BigQuery

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)

Pour définir une table BigQuery

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)

Créer le jeu de données/table et écrire dans la table dans BQ

# 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)
6
Ekaba Bisong

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})  
1
Porada Kev

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 .

0
intotecho

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!

0
dartdog