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
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.
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')
Update auf @Anthonios Parthenious Antwort.
Der Code ist jetzt etwas anders - am 29. Nov. 2017
Ü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)
Ü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)
# 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)
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})
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')
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 .
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!