wake-up-neo.com

Schreiben Sie einen Pandas DataFrame an Google Cloud Storage oder BigQuery

Hallo und vielen Dank für Ihre Zeit und Rücksichtnahme. Ich entwickle ein Jupyter Notebook in der Google Cloud-Plattform/Datalab. Ich habe einen Pandas DataFrame erstellt und möchte diesen DataFrame in beide Google Cloud Storage (GCS) schreiben und/oder BigQuery. Ich habe einen Bucket in GCS und habe mit folgendem Code folgende Objekte erstellt:

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()  

Ich habe verschiedene Ansätze basierend auf der Google Datalab-Dokumentation ausprobiert, scheitere aber weiterhin

14
EcoWarrior

Versuchen Sie das folgende Arbeitsbeispiel: 

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)

Ich habe this als Beispiel verwendet und die _table.py -Datei von der datalab-Github-Site als Referenz. Weitere datalab-Quellcodedateien finden Sie unter this -Link.

10

Verwenden der Google Cloud Datalab-Dokumentation

import datalab.storage as gcs
gcs.Bucket('bucket-name').item('to/data.csv').write_to(simple_dataframe.to_csv(),'text/csv')
11
Jan Krynauw

Pandas-DataFrame in BigQuery schreiben

Update auf @Anthonios Parthenious Antwort.
Der Code ist jetzt etwas anders - am 29. Nov. 2017

So definieren Sie ein BigQuery-Dataset

Übergeben Sie einen Tupel mit project_id und dataset_id an bq.Dataset

# define a BigQuery dataset    
bigquery_dataset_name = ('project_id', 'dataset_id')
dataset = bq.Dataset(name = bigquery_dataset_name)

So definieren Sie eine BigQuery-Tabelle

Übergeben Sie ein Tupel mit project_id, dataset_id und dem Tabellennamen an bq.Table

# define a BigQuery table    
bigquery_table_name = ('project_id', 'dataset_id', 'table_name')
table = bq.Table(bigquery_table_name)

Erstellen Sie die Datenmenge/Tabelle und schreiben Sie sie in BQ in die Tabelle

# 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

Ich habe eine etwas einfachere Lösung für die Aufgabe mit Dask . Sie können Ihren DataFrame in Dask DataFrame konvertieren, der in csv in Cloud Storage geschrieben werden kann

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

Hochladen auf Google Cloud Storage, ohne eine temporäre Datei zu schreiben und nur mit dem Standard-GCS-Modul

from google.cloud import storage
import os
import pandas as pd

# Only need this if you're running this code locally.
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = r'/your_GCP_creds/credentials.json'

df = pd.DataFrame(data=[{1,2,3},{4,5,6}],columns=['a','b','c'])

client = storage.Client()
bucket = client.get_bucket('my-bucket-name')

bucket.blob('upload_test/test.csv').upload_from_string(df.to_csv(), 'text/csv')
1
Theo

Seit 2017 hat Pandas eine Dataframe-Funktion für BigQuery pandas.DataFrame.to_gbq

Die Dokumentation hat ein Beispiel:

import pandas_gbq as gbq gbq.to_gbq(df, 'my_dataset.my_table', projectid, if_exists='fail')

Parameter if_exists kann auf 'fail', 'replace' oder 'append' gesetzt werden

Siehe auch dieses Beispiel .

0
intotecho

Ich denke, Sie müssen es in eine einfache Byte-Variable laden und eine %% -Speicher-Schreibvariable $ sample_bucketpath (siehe das Dokument) in einer separaten Zelle verwenden ... Ich finde es immer noch heraus ... Aber das ist ungefähr so Umgekehrt zu dem, was ich zum Lesen einer CSV-Datei tun musste, weiß ich nicht, ob es beim Schreiben einen Unterschied macht, aber ich musste BytesIO verwenden, um den Puffer zu lesen, der mit dem Befehl %% storage read erstellt wurde ... Hoffe es hilft, lass es mich wissen!

0
dartdog