Написать DataFrame Pandas в Google Cloud Storage или BigQuery
Здравствуйте и спасибо за ваше время и внимание. Я занимаюсь разработкой ноутбука Jupyter в облачной платформе Google / Datalab. Я создал DataFrame Pandas и хотел бы записать этот DataFrame в Google Cloud Storage(GCS) и / или BigQuery. У меня есть корзина в GCS, и я с помощью следующего кода создал следующие объекты:
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()
Я пробовал различные подходы, основанные на документации Google Datalab, но продолжаю терпеть неудачу. Спасибо
10 ответов
Попробуйте следующий рабочий пример:
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)
Я использовал этот пример и файл _table.py с сайта gatub datalab в качестве ссылки. Вы можете найти другие datalab
файлы исходного кода по этой ссылке.
Загрузка в Google Cloud Storage без записи временного файла и только с использованием стандартного модуля GCS
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')
Я потратил много времени, чтобы найти самый простой способ решить эту проблему:
import pandas as pd
df = pd.DataFrame(...)
df.to_csv('gs://bucket/path')
Использование документации Google Cloud Datalab
import datalab.storage as gcs
gcs.Bucket('bucket-name').item('to/data.csv').write_to(simple_dataframe.to_csv(),'text/csv')
Запись DataFrame для Pandas в BigQuery
Обновите ответ @Anthonios Partheniou.
Код теперь немного другой - по состоянию на 29 ноября 2017 года
Чтобы определить набор данных BigQuery
Передайте кортеж, содержащий project_id
а также dataset_id
в bq.Dataset
,
# define a BigQuery dataset
bigquery_dataset_name = ('project_id', 'dataset_id')
dataset = bq.Dataset(name = bigquery_dataset_name)
Чтобы определить таблицу BigQuery
Передайте кортеж, содержащий project_id
, dataset_id
и имя таблицы для bq.Table
,
# define a BigQuery table
bigquery_table_name = ('project_id', 'dataset_id', 'table_name')
table = bq.Table(bigquery_table_name)
Создать набор данных / таблицу и записать в таблицу в 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)
С 2017 года Pandas имеет функцию Dataframe to BigQuery pandas.DataFrame.to_gbq
В документации есть пример:
import pandas_gbq as gbq
gbq.to_gbq(df, 'my_dataset.my_table', projectid, if_exists='fail')
параметр if_exists
может быть установлен на "fail", "replace" или "append"
Смотрите также этот пример.
Чтобы сохранить файл паркета в GCS с аутентификацией из-за учетной записи службы:
df.to_parquet("gs://<bucket-name>/file.parquet",
storage_options={"token": <path-to-gcs-service-account-file>}
У меня есть немного более простое решение для задачи, используя Dask. Вы можете преобразовать свой DataFrame в Dask DataFrame, который можно записать в CSV в облачном хранилище.
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})
К
Google storage
:
def write_df_to_gs(df, gs_key):
df.to_csv(gs_key)
К
BigQuery
:
def upload_df_to_bq(df, project, bq_table):
df.to_gbq(bq_table, project_id=project, if_exists='replace')
Я думаю, вам нужно загрузить его в обычную байтовую переменную и использовать запись %%storage --variable $sample_bucketpath(см. Документ) в отдельной ячейке... Я все еще выясняю это... Но это примерно в противоположность тому, что мне нужно было сделать для чтения файла CSV, я не знаю, имеет ли это значение при записи, но мне пришлось использовать BytesIO для чтения буфера, созданного командой чтения %%storage... Надеюсь, это помогает, дайте мне знать!