使用 to_gbq 将 Pandas DataFrame 导出到 Google BigQuery

2023-10-20

The to_gbq功能允许您从a上传数据Pandas到 BigQuery 表中。

在本教程中,您将学习如何从 Pandas 导出数据数据框使用 BigQueryto_gbq功能。

 

 

安装所需的库

首先,您需要确保您拥有pandas-gbq库已安装。

该库提供了基本功能,例如to_gbq我们将使用的。


!pip install pandas-gbq
  

Output:


Collecting pandas-gbq
...
Successfully installed pandas-gbq-x.x.x
  

 

设置 Google Cloud SDK

如果您尚未安装 Google Cloud SDK,请按照说明操作:


!curl https://sdk.cloud.google.com | bash
  

重新启动 shell 或终端以添加gcloud到你的道路。

安装 SDK 后,您可以使用以下方式进行身份验证:


!gcloud auth login
  

系统会提示您使用 Google 凭据登录。成功登录后,您的凭据将存储在本地并用于将来的请求。

通过编程访问pandas-gbq,您需要设置应用程序默认凭据。跑步:


!gcloud auth application-default login
  

您将被引导完成身份验证过程。完成此步骤后,您的 Python 脚本将使用pandas-gbq可以与 BigQuery 交互。

 

to_gbq 语法和参数

The to_gbq函数语法如下:


DataFrame.to_gbq(destination_table, project_id=None,
 chunk_size=None, reauth=False, if_exists='fail',
 auth_local_webserver=False, table_schema=None,
 location=None, progress_bar=True, credentials=None)
  

参数:

  1. 目的地表(str):您想要以“dataset.tablename”格式写入数据的表的名称。
  2. 项目ID(str,可选):您的 Google Cloud 项目 ID。如果没有提供,则会从环境中推断。
  3. chunk_size(整数,可选):要从 DataFrame 插入到每个块中的行数。默认情况下,它会一次插入所有行。
  4. reauth(布尔值,默认 False):强制 Google 用户重新进行身份验证,这在使用多个帐户时非常有用。
  5. if_exists (str, 默认‘失败’):表已存在时的行为。选项包括“失败”、“替换”和“追加”。
  6. auth_local_webserver(布尔值,默认 False):使用本地网络服务器流进行身份验证。
  7. table_schema(字典列表或 pandas.DataFrame.schema,可选):如果需要,定义 BigQuery 表的架构。
  8. 位置(str,可选):表的地理位置。默认为您的 GCP 帐户中设置的位置。
  9. Progress_bar(布尔值,默认 True):显示上传进度条。
  10. 凭据(google.auth.credentials.Credentials,可选):用于通过 GCP 进行身份验证的凭据。默认情况下,它使用应用程序默认凭据。

 

指定数据集和表destination_table

The destination_table字符串应遵循“dataset.tablename”格式。举个例子:

如果您想将数据上传到“sales_data”数据集中的“monthly_sales”表,您的destination_table字符串将是:


destination_table = 'sales_data.monthly_sales'
  

使用时to_gbq,它看起来像这样:


df.to_gbq(destination_table='sales_data.monthly_sales', project_id='your_project_id')
  

Note:如果指定的表不存在,to_gbq将为您创建它(基于if_exists范围)。

 

使用if_exists范围

The if_exists中的参数to_gbq方法控制当您尝试将 DataFrame 上传到已存在的 BigQuery 表时的行为。

默认行为if_exists='fail'

这是默认行为。如果 BigQuery 中已存在该表,则上传操作将失败,并且不会进行任何更改。

Example:


df.to_gbq(destination_table='dataset_name.table_name', project_id='your_project_id', if_exists='fail')
  

Output:

如果表已经存在:


TableCreationError: Table dataset_name:table_name already exists.
  

替换现有数据if_exists='replace'

如果该表已存在于 BigQuery 中,它将被新数据覆盖。本质上,现有表将被删除,并创建一个新表。

Example:


df.to_gbq(destination_table='dataset_name.table_name', project_id='your_project_id', if_exists='replace')
  

Output:

表是否存在:


1 out of 1 chunks uploaded.
  

将数据追加到现有表if_exists='append'

如果 BigQuery 中已存在该表,则 DataFrame 中的数据将附加到该表中。

如果该表不存在,则会创建该表。

Example:


df.to_gbq(destination_table='dataset_name.table_name', project_id='your_project_id', if_exists='append')
  

Output:

表是否存在:


1 out of 1 chunks uploaded.
  

 

手动表架构定义

该架构被定义为字典列表,其中每个字典代表一个列、其数据类型和可选属性。

每本词典一般都有:

  • name:列的名称。
  • type:BigQuery 格式的列的数据类型。
  • 模式(可选):定义列是否可以有 NULL 值或者是否是重复字段。默认为“NULLABLE”。

假设您有以下 DataFrame:


import pandas as pd
data = {
    'Product': ['A', 'B', 'C'],
    'Sales': [100, 150, 200],
    'Date': ['2023-01-01', '2023-01-02', '2023-01-03']
}
df = pd.DataFrame(data)
  

定义架构

对于我们的 DataFrame,手动模式定义如下所示:


table_schema = [
    {'name': 'Product', 'type': 'STRING'},
    {'name': 'Sales', 'type': 'INT64'},
    {'name': 'Date', 'type': 'DATE'}
]
  

Use to_gbq具有指定模式

您可以使用table_schema指定模式的参数:


df.to_gbq(destination_table='sales_data.product_sales', project_id='your_project_id', table_schema=table_schema, if_exists='replace')
  

Output:


1 out of 1 chunks uploaded.
  

 

处理嵌套和重复的列

您可以使用table_schema参数来指定嵌套列或重复列的架构。

具有嵌套数据的示例数据框:


import pandas as pd
data = {
    'Product': ['A', 'B'],
    'Details': [{'Color': 'Red', 'Size': 'Large'}, {'Color': 'Blue', 'Size': 'Medium'}]
}
df = pd.DataFrame(data)
  

模式定义:

对于嵌套列,您的模式字典中需要一个“fields”键:


table_schema = [
    {'name': 'Product', 'type': 'STRING'},
    {'name': 'Details', 'type': 'RECORD', 'fields': [
        {'name': 'Color', 'type': 'STRING'},
        {'name': 'Size', 'type': 'STRING'}
    ]}
]
  

具有重复数据的 DataFrame:

重复列允许您拥有特定字段的数据数组。它对于一对多关系很有用。


data = {
    'Product': ['A', 'B'],
    'Tags': [['Outdoor', 'Summer'], ['Indoor', 'Winter']]
}
df = pd.DataFrame(data)
  

模式定义

对于重复列,请使用 ‘mode’: ‘REPEATED’:


table_schema = [
    {'name': 'Product', 'type': 'STRING'},
    {'name': 'Tags', 'type': 'STRING', 'mode': 'REPEATED'}
]
  

现在你使用to_gbq像这样:


df.to_gbq(destination_table='sales_data.product_info', project_id='your_project_id', table_schema=table_schema, if_exists='replace')
  

 

对大型数据帧进行分块

The chunksize中的参数to_gbq函数指定每个块的行数。使用方法如下:


import pandas as pd
import pandas_gbq

# Sample large DataFrame
data = {'column1': range(1, 100001), 'column2': range(100001, 1, -1)}
large_df = pd.DataFrame(data)

# Using chunksize with to_gbq
pandas_gbq.to_gbq(large_df, 'your_dataset.your_table', project_id='your_project_id', if_exists='replace', chunksize=5000)
  

在此示例中,大型 DataFramelarge_df100,000 行被分成每块 5,000 行的块,从而导致 20 次单独上传到 BigQuery。

 

使用进度栏跟踪上传进度

The progress_bar参数输入to_gbq功能允许您跟踪上传进度。


df.to_gbq(destination_table='dataset_name.table_name', project_id='your_project_id', progress_bar=True)
  

Output:

控制台或 Jupyter Notebook 中的动态进度条会随着数据块的上传而更新:


Uploading: 100%|█████████████████████████| 5/5 [00:05<00:00,  1.00s/rows]
  

 

Logging

您可以设置日志记录以获取有关上传过程的详细信息,这对于调试特别有用。

首先,配置Python的日志模块:


import logging
logging.basicConfig(level=logging.INFO)
  

有了这个设置,pandas_gbq将提供有关上传过程的详细日志。

Output:


INFO:pandas_gbq.gbq:Uploading 1000000 rows to table dataset_name.table_name
  

 

现实世界的例子

想象一下,您运行一个电子商务网站,其中包含保存交易记录的 PostgreSQL 数据库。

您希望每天午夜将此事务数据同步到 BigQuery,以运行复杂的分析、生成报告,或许还可以将其与 Data Studio 等其他 GCP 工具一起使用。

从 PostgreSQL 提取数据

首先,您需要从本地 PostgreSQL 实例中提取相关数据:


import psycopg2
import pandas as pd
conn = psycopg2.connect(
    host="localhost",
    database="your_database",
    user="your_user",
    password="your_password"
)
query = "SELECT * FROM transactions WHERE transaction_date >= current_date - interval '1 day';"
df = pd.read_sql_query(query, conn)
conn.close()
  

将数据加载到 BigQuery

现在你已经有了 pandas DataFrame 中的数据,请使用to_gbq:


import pandas_gbq
destination = 'your_dataset.transactions'
df.to_gbq(destination_table=destination, project_id='your_project_id', if_exists='append')
  

自动化

每日同步:

使用任务调度程序:

    • 在 Linux 上,使用cron.
    • 在 Windows 上,使用任务计划程序。
    • 如果您正在利用 GCP,请考虑使用 Cloud Functions 或 Cloud Scheduler。

对于这个工作:

Linux 计划任务示例:


0 0 * * * /usr/bin/python3 /path_to_script/your_script.py
  

这将在每天午夜运行该脚本。

 

Resource

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_gbq.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 to_gbq 将 Pandas DataFrame 导出到 Google BigQuery 的相关文章

  • 如何让服务器监听多个端口

    我想用同一台服务器监听 100 个不同的 TCP 端口 这是我目前正在做的事情 import socket import select def main server socket socket socket socket AF INET
  • Boto3 - 打印 AWS 实例平均 CPU 利用率

    我正在尝试仅打印 AWS 实例的平均 CPU 利用率 此代码将打印出 响应 但最后的 for 循环不会打印平均利用率 有人可以帮忙吗 先感谢您 import boto3 import sys from datetime import dat
  • TypeError:PyQt4.QtCore.QVariantAnimation 表示 C++ 抽象类,无法实例化

    我有这个 PyQt5 片段 我正在尝试将其转换为 PyQt4 PyQt5 版本运行得很好 但是当我尝试转换为 PyQt4 时 出现此错误 我删除了QtWidgets但我仍然收到此错误 我也尝试过实例化self animation QtCor
  • 如何从 Django 中的 ModelForm 手动创建选择字段?

    我有一个ModelForm其中字段之一 名为creator is a ForeignKey 因此对于 form creator Django 渲染
  • 用户在对话框中输入

    python 中是否有任何库可用于图形用户输入 我知道关于tk但我相信需要一些代码才能做到这一点 我正在寻找最短的解决方案 a input Enter your string here 取而代之的是 我想要一个对话框 以便用户可以在那里输入
  • 计算5个城市之间的地理距离以及每个城市所有可能的组合

    所以我有一个 csv 文件 其中包含 3 列 城市 纬度 经度 我已经使用此代码从这个 csv 文件在 python 中创建了一个数据框 data pd read csv lat long csv nrows 10 Lat data lat
  • 我应该如何在 Python 中将 HTTPHandler 与 RotatingFileHandler 链接起来?

    我需要创建一个系统 将嵌入式系统中生成的日志消息远程记录在服务器上并存储在轮换日志文件中 由于网络通信的限制 日志消息必须通过HTTP协议传输 服务器已经运行了Flask http flask pocoo org 基于 HTTP 服务器 因
  • 枚举列表中的列表

    我有一个约会 并记录了那天发生的事件 我想枚举显示日历的日期的事件列表 我还需要能够从列表中删除事件 def command add date event calendar if date not in calendar calendar
  • 如何使用Python优化大型数据集的API调用?

    客观的 将地址列表发送到 API 并提取某些信息 例如 指示地址是否位于洪水区域的标志 Solution 适用于小数据的 Python 脚本 Problem 我想针对大输入优化当前的解决方案 如何提高 API 调用的性能 如果我有 100
  • 类型错误:“State”和“State”实例之间不支持“<” PYTHON 3

    我正在尝试利用队列类中的 PriorityQueue 但是 我在将自定义对象放入 PQ 时遇到问题 我已经实施了 cmp 函数如下 def cmp self other return self priority gt other prior
  • 如何从另一个 Python 文件将 Uvicorn FastAPI 服务器作为模块运行?

    我想使用 Uvicorn 从不同的 Python 文件运行 FastAPI 服务器 uvicorn模块 main py import uvicorn import webbrowser from fastapi import FastAPI
  • 如何在 Robot Framework 中将变量定义为具有列表值的字典

    在我的一个测试用例中 我需要定义一个字典 其中键是字符串 值是字符串数组 我怎样才能在机器人框架中做到这一点 我第一次尝试使用如下所示的构造 但行不通 Variables Dictionary A StringA1 StringA2 B S
  • 在 python matplotlib 中格式化损坏的 y 轴

    我正在 matplotlib 中处理一个 相当复杂的 条形图 它包含来自多个源的摘要数据 每个源都沿 x 轴标记 y 轴上有一系列结果 许多结果都是异常值 我尝试使用断开的 y 轴来显示这些结果 而不会使用以下组合来扭曲整个图表这个方法 h
  • 如何使用 Pandas 在现有 Excel 文件中保存新工作表?

    我想使用excel文件来存储用python详细说明的数据 我的问题是我无法将工作表添加到现有的 Excel 文件中 在这里 我建议使用示例代码来解决此问题 import pandas as pd import numpy as np pat
  • 错误:线条魔术函数

    我正在尝试使用 python 读取文件 但不断收到此错误 ERROR Line magic function user vars not found 我的代码非常基本 names read csv Combined data csv nam
  • 如何将目录导入为 python 模块

    如果有目录 home project aaa 我知道它是一个Python包 那么 我如何通过知道它的路径来导入这个模块 这意味着 我希望代码能够正常工作 aaa load module home project aaa 我知道的唯一方法是
  • 为什么“模型尚未加载”?

    我正在尝试使用 customUser 安装 django registration redux 我已将其包含在我的 settings py 中 AUTH USER MODEL app customUser 注册表位于目录 registrat
  • Flask-SQLAlchemy:如何有条件地插入或更新行

    我的应用程序使用 Flask Flask SQLAlchemy Flask WTF 和 Jinja2 的组合 在当前的版本中 我有一个设置表 该表只有一条记录和一个字段 最初该表包含零条记录 我想要实现的是 鉴于数据库中不存在任何条目 则显
  • App Engine、PIL 和叠加文本

    我正在尝试在 GAE 上的图像上覆盖一些文本 现在他们公开了 PIL 库 这应该不是问题 这就是我所拥有的 它有效 但我不禁认为我应该直接写入背景图像 而不是创建单独的覆盖图像然后合并 我可以用吗Image frombuffer http
  • Python TDD 目录结构

    Python 中是否有用于 TDD 的特定目录结构 教程讨论测试的内容 但不讨论测试的位置 通过研究 Python Koans 怀疑它是这样的 project main program py This has main method sta

随机推荐

  • 如何在 CentOS 7 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 专为客户端和服务器之间的安全连接而设计 两种最流行的 SSH 身份验证机制是基于密码的身份验证和基于公钥的身份验证 使用 SSH 密钥通常比传统的密码身份验证更安全 更方便 本教程介绍如
  • 如何重命名本地和远程 Git 分支

    您正在与一群人合作开发一个项目 并且您已经为 git 分支定义了命名约定 你创建了一个新分支 将更改推送到远程存储库 并意识到您的分支名称不正确 幸运的是 Git 允许您使用以下命令轻松地重命名分支 git branch m命令 本指南介绍
  • 了解 Linux 文件权限

    在 Linux 中 文件权限 属性和所有权控制系统进程和用户对文件的访问级别 这确保只有授权的用户和进程才能访问特定的文件和目录 Linux 文件权限 基本的 Linux 权限模型的工作原理是将每个系统文件与所有者和组相关联 并为三类不同的
  • Python 字符串替换

    在本文中 我们将讨论如何在 Python 中使用replace method replace 方法 在Python中 字符串被表示为不可变的str对象 这str类附带了许多允许您操作字符串的方法 The replace 方法采用以下语法 s
  • 如何在 Ubuntu 18.04 上安装 Sublime Text 3

    崇高的文字是用于 Web 和软件开发的最广泛使用的文本和源代码编辑器之一 它速度非常快 并且具有许多开箱即用的强大功能 您可以通过安装新插件和创建自定义设置来增强其功能 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安
  • Linux 中的 rmmod 命令

    每个Linux操作系统的核心组件是Linux内核 它管理系统的资源 并充当计算机硬件和软件之间的中介 Linux内核是一个采用模块化设计的软件 内核模块 通常称为驱动程序 是扩展内核功能的一段代码 模块可以编译为可加载模块或内置到内核中 可
  • 如何在 Windows 上创建可启动的 Ubuntu U 盘

    本教程将引导您完成在 Windows 上创建可启动 Ubuntu U 盘的过程 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 Microsoft
  • 如何在 CentOS 8 上安装 Ruby

    Ruby 是当今最流行的语言之一 它具有优雅的语法 并且是 Ruby on Rails 框架背后的语言 在本文中 我们将探索在 CentOS 8 上安装 Ruby 的不同方法 我们将展示如何从默认的 CentOS 8 存储库并使用 Rben
  • 如何在 Vim / Vi 中复制、剪切和粘贴

    处理文本文件时 复制 剪切和粘贴文本是最常执行的任务之一 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 在您最喜欢的编辑器不可用的情况下 了解 Vim 的基础知识会很有帮助 本文介绍如何在 Vim Vi 编辑
  • 如何创建并列出本地和远程 Git 分支

    分支是软件开发过程的一部分 也是 Git 中最强大的功能之一 分支本质上是指向某个提交的指针 当修复错误或开发新功能时 开发人员正在创建一个新分支 稍后可以将其合并到主代码库中 本文介绍如何创建和列出本地和远程 Git 分支 列出 Git
  • Linux find 命令的高级正则表达式

    The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录 的一项强大功能find是它使用正则表达式进行搜索的能力 正则表达式 或简称 regex 提供了一种匹配字符串中字符序列的方法 目录 hide 1 正则表达式引
  • Bash While 循环:从基础知识到实际应用

    In Bash 脚本 while 循环用于在指定条件为 true 时执行语句块 基本语法是 while CONDITION do Commands to be executed done 只要 CONDITION 计算结果为 true 循环
  • 使用 Pandas DataFrame iloc 属性进行基于索引的访问

    The iloc财产在Pandas库代表 整数位置 并提供基于整数的索引以按位置进行选择 这意味着您可以通过整数位置选择 DataFrame 中的行和列 在本教程中 我们将介绍使用的各个方面iloc 包括选择单行 多行 特定列 甚至单个单元
  • Python defaultdict 简介:类固醇词典

    在Python中 defaultdict是一个类似于字典的类collections模块允许我们为字典中未显式设置的键定义默认值 它是内置的子类dict class Both dict and defaultdict用于以键值对格式 Pyth
  • 19 个有用的 Linux 命令行提示和技巧

    您可能已经注意到 Linux 是一个非常复杂的操作系统 因此 当发生的事情太多时 工作可能会变得有点乏味 但这正是 Linux 的自然之美的闪光点 有许多技巧和快捷方式可以在命令行中使用 以提供额外的便利 这一系列的技巧包括方便的命令和巧妙
  • Python 编程基础知识与示例

    Python 是一种流行且功能强大的脚本语言 可以做任何事情 您可以执行网页抓取 网络工具 科学工具 Raspberry Pi 编程 Web 开发 视频游戏等等 通过Python编程 无论您使用什么平台 您甚至可以进行系统编程 说到机器学习
  • 退出/终止 Python 脚本(简单示例)

    今天 我们将深入探讨退出 终止 Python 脚本的主题 您可以使用您选择的 IDE 但这次我将使用 Microsoft 的 Linux Subsystem for Windows WSL 软件包 有关该功能以及如何在 Windows 10
  • 使用 Pandas read_sql 将 SQL 查询/表读入 DataFrame

    The read sql函数允许您将数据从 SQL 数据库直接加载到Pandas数据框 它允许您直接解析和执行 SQL 查询或将整个表读入数据框 通过使用pandas read sql 您正在 SQL 数据库和 Pandas 之间建立无缝桥
  • 在 Linux 中使用 for 循环迭代文件

    在 Linux 中循环文件是一项方便的技能 它可以帮助您更轻松地管理和组织文件 在本教程中 我们将学习如何使用 Bash 循环文件 我们将看看如何使用for loop迭代常规文件 名称中带有空格的文件 目录 忽略大小写等等 在本教程结束时
  • 使用 to_gbq 将 Pandas DataFrame 导出到 Google BigQuery

    The to gbq功能允许您从a上传数据Pandas到 BigQuery 表中 在本教程中 您将学习如何从 Pandas 导出数据数据框使用 BigQueryto gbq功能 目录 hide 1 安装所需的库 2 设置 Google Cl