我有一个很大的(10 GB的)CSV文件,我想将其加载到dask
中,并针对每一行执行一些计算。我也想将经过处理的CSV的结果写入BigQuery中,但是最好将网络请求批量发送到BigQuery中,例如每组10,000行,这样就不会造成每行网络开销。
我一直在研究dask delayed
,发现可以创建一个任意的计算图,但是我不确定这是否是正确的方法:如何基于某些方法收集和触发中间计算小组人数(或者可能是经过的时间)。有人可以提供一个简单的例子吗?为简单起见,我们具有以下功能:
def change_row(r):
# Takes 10ms
r = some_computation(r)
return r
def send_to_bigquery(rows):
# Ideally, in large-ish groups, say 10,000 rows at a time
make_network_request(rows)
# And here's how I'd use it
import dask.dataframe as dd
df = dd.read_csv('my_large_dataset.csv') # 20 GB
# run change_row(r) for each r in df
# run send_to_big_query(rows) for each appropriate size group based on change_row(r)
谢谢!
答案 0 :(得分:1)
最简单的方法是为read_csv
提供一个块大小参数,这将使您每个块的行数大致正确。您可能需要测量一些数据或进行实验才能做到这一点。
其余任务的工作方式将与其他任何“对数据帧块执行此通用操作”的方法相同:“ map_partitions”方法(docs)。
def alter_and_send(df):
rows = [change_row(r) for r in df.iterrows()]
send_to_big_query(rows)
return df
df.map_partitions(alter_and_send)
基本上,您正在逻辑dask数据框的每一部分上运行该功能,它们是真实的pandas数据框。 您实际上可能希望在函数中映射,应用或其他数据框方法。
这是一种实现方法-您实际上并不需要地图的“输出”,而可以使用to_delayed()
。