将大文件发送到 BigQuery

Posted

技术标签:

【中文标题】将大文件发送到 BigQuery【英文标题】:Steaming a large file into BigQuery 【发布时间】:2018-04-06 15:18:56 【问题描述】:

我正在尝试在 python 中整理一个大 (8gb) .csv 文件,然后将其流式传输到 BigQuery。我下面的代码开始正常,因为创建了表并进入了前 1000 行,但随后出现错误:

InvalidSchema: Please verify that the structure and data types in the DataFrame match the schema of the destination table.

这可能与流缓冲区有关吗?我的问题是我需要在再次运行代码之前删除表,否则前 1000 个条目将由于“追加”方法而重复。

import pandas as pd

destination_table = 'product_data.FS_orders'
project_id = '##'
pkey ='##'

chunks = []

for chunk in pd.read_csv('Historic_orders.csv',chunksize=1000, encoding='windows-1252', names=['Orderdate','Weborderno','Productcode','Quantitysold','Paymentmethod','ProductGender','DeviceType','Brand','ProductDescription','OrderType','ProductCategory','UnitpriceGBP' 'Webtype1','CostPrice','Webtype2','Webtype3','Variant','Orderlinetax']):
    chunk.replace(r' *!','Null', regex=True)
    chunk.to_gbq(destination_table, project_id, if_exists='append', private_key=pkey)
    chunks.append(chunk)

df = pd.concat(chunks, axis=0)

print(df.head(5))

pd.to_csv('Historic_orders_cleaned.csv')

【问题讨论】:

你的csv文件可能有一些无效字符,比如非utf 8数据。 你为什么要播放它?加载作业会更好地使用现有的 csv @FelipeHoffa 你知道是否可以使用 to_gbq 进行批处理吗?我该如何更改? 【参考方案1】:

问题: - 为什么是流媒体而不是简单地加载?这样,您可以批量上传 1 GB 而不是 1000 行。当您确实有需要在发生时附加的连续数据时,通常会出现流式传输。如果您在收集数据和加载作业之间有 1 天的休息时间,那么加载它通常更安全。 see here.

除此之外。我在从 csv 文件加载 bigQuery 表时遇到了一些问题,而且大多数情况下是 1)编码(我看到你有非 utf-8 编码)和 2)无效字符,一些逗号在文件中间断行。

为了验证这一点,如果你向后插入行怎么办?你会遇到同样的错误吗?

【讨论】:

非常好的一点 - 你知道我如何在 Python 代码中选择流式传输或加载吗? @费利佩 嗨@BenP 所以here 你看到了如何流式传输数据。要加载,您通常会创建一个作业并设置参数和数据 - see here。要进行流式传输,您可以在代码执行时使用tabledata().insertAll() 方法直接将每一行写入表

以上是关于将大文件发送到 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 python 中的 bigquery API 将数据集中所有表的计数(*)发送到 csv 文件?

通过 POST 将 CSV 数据发送到 BigQuery REST API

C# 将大文件写入网络流的问题。。。

将大文件上传到服务器时,OAuth 访问令牌已过期

Adwords 到 BigQuery Data Transfer Service 不会发送来自视频广告系列的转化数据

通过 PHP 将 MySQL 数据发送到 Google BigQuery