python - 从 Pandas 数据帧创建 BigQuery 表,无需明确指定架构

标签 python pandas google-bigquery

我有一个 Pandas 数据框,想从中创建一个 BigQuery 表。我知道有很多帖子都在问这个问题,但到目前为止我能找到的所有答案都需要明确指定每一列的架构。例如:

from google.cloud import bigquery as bq

client = bq.Client()

dataset_ref = client.dataset('my_dataset', project = 'my_project')
table_ref = dataset_ref.table('my_table')  

job_config = bq.LoadJobConfig( 
 schema=[ 
     bq.SchemaField("a", bq.enums.SqlTypeNames.STRING),
     bq.SchemaField("b", bq.enums.SqlTypeNames.INT64), 
     bq.SchemaField("c", bq.enums.SqlTypeNames.FLOAT64),         
 ]
) 

client.load_table_from_dataframe(my_df, table_ref, job_config=job_config).result()
但是,有时我有一个包含许多列(例如 100 列)的数据框,指定所有列确实很重要。有没有办法有效地做到这一点?
顺便说一句,我发现这篇文章有类似的问题:Efficiently write a Pandas dataframe to Google BigQuery
但似乎是 bq.Schema.from_dataframe不存在:
AttributeError: module 'google.cloud.bigquery' has no attribute 'Schema'

最佳答案

这是将 DataFrame 加载到 BQ 的代码片段:

import pandas as pd
from google.cloud import bigquery

# Example data
df = pd.DataFrame({'a': [1,2,4], 'b': ['123', '456', '000']})

# Load client
client = bigquery.Client(project='your-project-id')

# Define table name, in format dataset.table_name
table = 'your-dataset.your-table'

# Load data to BQ
job = client.load_table_from_dataframe(df, table)
如果您只想指定架构的一个子集并仍然导入所有列,则可以使用以下命令切换最后一行
# Define a job config object, with a subset of the schema
job_config = bigquery.LoadJobConfig(schema=[bigquery.SchemaField('b', 'STRING')])

# Load data to BQ
job = client.load_table_from_dataframe(df, table, job_config=job_config)

关于python - 从 Pandas 数据帧创建 BigQuery 表,无需明确指定架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63200201/

相关文章:

pandas - 标记每个 groupby 中的第一个元素

python - 如何使用周期性值列拆分 pandas 数据框

google-sheets - 如何验证服务帐户以对 GDrive Sheet 支持的 BigQuery 表进行查询?

python - 如何安装启用 CUDA 的 Pytorch 1.3.1

python - 如何更正确地近似点

javascript - 上传包含复数的 CSV 文件并在 Bokeh 网络应用程序中读取它

python - 如何复制 Pandas 数据帧以匹配其他数据帧长度?

csv - 从 Google Cloud Storage 加载 csv 文件时出现 BigQuery 错误

google-sheets - 在运行 BigQuery 作业之前确定资源使用情况

python - csv在循环python内的行中写入替代空格