41

您好,感谢您的时间和考虑。我正在 Google Cloud Platform / Datalab 中开发 Jupyter Notebook。我创建了一个 Pandas DataFrame,并希望将此 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 文档的各种方法,但仍然失败。谢谢

4

10 回答 10

34

上传到谷歌云存储而不写入临时文件,只使用标准 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')
于 2019-08-08T01:33:58.263 回答
23

尝试以下工作示例:

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)

我使用了这个示例,以及来自datalab github 站点的_table.py文件作为参考。您可以在此链接中找到其他源代码文件。datalab

于 2016-03-31T11:20:02.203 回答
17

使用 Google Cloud Datalab 文档

import datalab.storage as gcs
gcs.Bucket('bucket-name').item('to/data.csv').write_to(simple_dataframe.to_csv(),'text/csv')
于 2017-03-14T15:43:23.757 回答
16

我花了很多时间找到解决这个问题的最简单方法:

import pandas as pd

df = pd.DataFrame(...)

df.to_csv('gs://bucket/path')
于 2020-03-11T21:31:55.337 回答
9

将 Pandas DataFrame 写入 BigQuery

更新@Anthonios Partheniou 的回答。
代码现在有点不同 - 截至2017 年 11 月 29 日

定义 BigQuery 数据集

将包含project_idand的元组传递dataset_idbq.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-11-29T16:36:51.937 回答
8

自 2017 年以来,Pandas 有一个 Dataframe 到 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'

另请参阅此示例

于 2019-01-30T06:43:22.217 回答
4

对于使用Dask的任务,我有一个更简单的解决方案。您可以将 DataFrame 转换为 Dask DataFrame,可以将其写入 Cloud Storage 上的 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})  
于 2018-12-11T16:09:12.373 回答
0

我认为你需要将它加载到一个普通的字节变量中,并在一个单独的单元格中使用 %%storage write --variable $sample_bucketpath(see the doc)...我还在想办法...但这大致与读取 CSV 文件所需的操作相反,我不知道它是否对写入有影响,但我必须使用 BytesIO 来读取由 %% storage read 命令创建的缓冲区...希望如此有帮助,告诉我!

于 2016-03-30T19:37:23.883 回答
0

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')
于 2021-08-07T16:36:06.017 回答
0

在 GCS 中保存 parquet 文件并使用服务帐户进行身份验证:

df.to_parquet("gs://<bucket-name>/file.parquet",
               storage_options={"token": <path-to-gcs-service-account-file>}
于 2021-12-16T12:21:39.437 回答