当前位置: 首页 > 知识库问答 >
问题:

向Google BigQuery高效地编写Pandas dataframe

厍晋鹏
2023-03-14
dataframe.to_gbq('my_dataset.my_table', 
                 'my_project_id',
                 chunksize=None, # I have tried with several chunk sizes, it runs faster when it's one big chunk (at least for me)
                 if_exists='append',
                 verbose=False
                 )

dataframe.to_csv(str(month) + '_file.csv') # the file size its 37.3 MB, this takes almost 2 seconds 
# manually upload the file into GCS GUI
print(dataframe.shape)
(363364, 21)
    null

备选方案2比备选方案1耗时更长(使用pd.dataframe.to_csv()load_data_from_file(),平均多17.9秒,3个循环):

def load_data_from_file(dataset_id, table_id, source_file_name):
    bigquery_client = bigquery.Client()
    dataset_ref = bigquery_client.dataset(dataset_id)
    table_ref = dataset_ref.table(table_id)
    
    with open(source_file_name, 'rb') as source_file:
        # This example uses CSV, but you can use other formats.
        # See https://cloud.google.com/bigquery/loading-data
        job_config = bigquery.LoadJobConfig()
        job_config.source_format = 'text/csv'
        job_config.autodetect=True
        job = bigquery_client.load_table_from_file(
            source_file, table_ref, job_config=job_config)

    job.result()  # Waits for job to complete

    print('Loaded {} rows into {}:{}.'.format(
        job.output_rows, dataset_id, table_id))

共有1个答案

楚俊逸
2023-03-14

我在datalab中使用以下代码对备选方案1和3进行了比较:

from datalab.context import Context
import datalab.storage as storage
import datalab.bigquery as bq
import pandas as pd
from pandas import DataFrame
import time

# Dataframe to write
my_data = [{1,2,3}]
for i in range(0,100000):
    my_data.append({1,2,3})
not_so_simple_dataframe = pd.DataFrame(data=my_data,columns=['a','b','c'])

#Alternative 1
start = time.time()
not_so_simple_dataframe.to_gbq('TestDataSet.TestTable', 
                 Context.default().project_id,
                 chunksize=10000, 
                 if_exists='append',
                 verbose=False
                 )
end = time.time()
print("time alternative 1 " + str(end - start))

#Alternative 3
start = time.time()
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 or overwrite the existing table if it exists
table_schema = bq.Schema.from_dataframe(not_so_simple_dataframe)

# Write the DataFrame to GCS (Google Cloud Storage)
%storage write --variable not_so_simple_dataframe --object $sample_bucket_object

# Write the DataFrame to a BigQuery table
table.insert_data(not_so_simple_dataframe)
end = time.time()
print("time alternative 3 " + str(end - start))

下面是n={10000,100000,1000000}的结果:

n       alternative_1  alternative_3
10000   30.72s         8.14s
100000  162.43s        70.64s
1000000 1473.57s       688.59s

从结果来看,备选方案3比备选方案1快。

 类似资料:
  • 本文向大家介绍在竞争性编程中高效地编写C / C ++代码,包括了在竞争性编程中高效地编写C / C ++代码的使用技巧和注意事项,需要的朋友参考一下 在竞争性编程中,最重要的是有效的代码。优化和更快的代码很重要,并且可以改变程序员的队伍。 要在竞争性编程中编写有效的c / c ++代码,以下是一些有效的工具,可以有效地编写c / c ++代码, 首先,让我们回顾一些基本术语, 模板正在编写不依赖

  • 我希望根据每个节点的配置将流量均匀地分配到各个节点。最多可以有100个节点,并且可以配置分配给多个节点的流量百分比。 所以说,如果有4个节点:- 所有节点的值之和应该是100。例子:- 在上述配置中,共有51个节点。节点1为50,其余50个节点配置为1。 在一个senario中,请求可以按以下模式分布:-节点1、节点2、节点3、节点4、节点5,。。。。,节点51,节点1,节点1,节点1,节点1,节

  • 本文向大家介绍如何写高效的CSS?相关面试题,主要包含被问及如何写高效的CSS?时的应答技巧和注意事项,需要的朋友参考一下 css大全,看下这篇文章吧,里面基本啥都有

  • 问题内容: 您将如何解决以下存储和检索问题? 每天(每年365天)将添加大约2.000.000行,每行包含以下信息: id(唯一的行标识符) entity_id (取值介于1到2.000.000(含)之间 date_id(每天增加一次-取值范围为1到3.650(十年:1 * 365 * 10)) value_1(取值范围在1到1.000.000之间(包括1和1.000.000之间) value_2

  • 下面的例子尽管有些不太现实,但却有可能实现与有噪声信道的完全匹配。 存在两个信道符号0和1,噪声对七个该等符号组成的块产生影响。一组七个符号要么无错误传送,要么恰有一个符号错误。这八种可能性是等概率的。有: 下面给出一种高效编码,它能够完全纠正所有错误,并以速率C进行传送(此种编码方式是由R.汉明发明的一种方法发现的): 设一组七个符号为。其中的为消息符号,由信源任何选择。其他三个为冗余,其计算如

  • 问题内容: 下面的Go代码读取10,000条记录的CSV(时间戳和浮点数),对数据进行一些操作,然后将原始值以及的附加列写入到另一个CSV中。但是,它的运行速度非常慢(例如,数小时,但大部分时间是),我很好奇我可以处理的CSV读取/写入是否效率低下。 我正在寻求帮助,以使此CSV读/写模板代码尽快。对于此问题的范围,我们不必担心该方法。 问题答案: 您先将文件加载到内存中,然后再对其进行处理,这对