python - 从 pandas 数据框创建 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)
推荐阅读
- java - 正在附加 Spring Boot URL
- mysql - 无法销毁rails中某些模型的记录
- swift - 快速编程核心数据fetchedResultsController.sections nil错误
- python - Pycharm win32api 模块安装报错:非零退出码(一)
- c# - 如何使用服务器端 Blazor 启用 Windows 身份验证
- c# - 使用 ModelState.IsValid == false 和 AllowHtml 属性发布后返回视图
- docker - Docker - 可以将 NFS 共享挂载到容器中,但不能挂载到容器的子目录中
- bash - 您如何为 aws cloudformation deploy --parameter-overrides 和/或 --tags 添加空间?
- php - laravel 获取帖子列表,包括他们的标签和评论
- sql - Oracle 18c - PL/SQL 限制写入文件的记录