Напишите Pandas DataFrame для облачного хранилища Google или BigQuery

Привет и спасибо за ваше время и внимание. Я разрабатываю Jupyter Notebook в Google Cloud Platform/Datalab. Я создал DataFrame Pandas и хотел бы написать этот DataFrame как для облачного хранилища Google (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, но продолжаю терпеть неудачу. Благодаря

Ответ 1

Попробуйте следующий рабочий пример:

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 с сайта gitub сайта datalab в качестве ссылки. Вы можете найти другие файлы исходного кода datalab по этой ссылке.

Ответ 2

Использование документации Google Cloud Datalab

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

Ответ 3

Запись Pandas DataFrame в 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)

Ответ 4

У меня есть немного более простое решение для задачи, используя 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})  

Ответ 5

С 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"

Смотрите также этот пример.

Ответ 6

Загрузка в 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')

Ответ 7

Мне кажется, вам нужно загрузить его в переменную простой байта и использовать файл хранения %% storage -variable $sample_bucketpath (см. документ) в отдельной ячейке... Я все еще понимаю это... Но Это примерно соответствует тому, что мне нужно было сделать, чтобы прочитать CSV файл, я не знаю, имеет ли значение значение для записи, но мне пришлось использовать BytesIO для чтения буфера, созданного командой чтения %% storage. Надеюсь, это поможет, дайте мне знать!

Ответ 8

Я разработал библиотеку оболочки Python, которая называется google-pandas-load и может быть вам полезна. Документация доступна по адресу https://google-pandas-load.readthedocs.io/en/latest/.

Настройте загрузчик:

from google_pandas_load import LoaderQuickSetup
gpl = LoaderQuickSetup(
    project_id='pi', 
    dataset_id='di', 
    bucket_name='bn', 
    local_dir_path='/tmp')

Загрузить фрейм данных в хранилище:

gpl.load(source='dataframe', destination='gs', data_name='a0', dataframe=df)

Загрузите фрейм данных в BigQuery:

gpl.load(source='dataframe', destination='bq', data_name='a0', dataframe=df)