中间dask计算的批处理结果

中间dask计算的批处理结果,dask,Dask,我有一个大的(10s GB)CSV文件,我想将其加载到dask,并对每一行执行一些计算。我还想将被操纵的CSV的结果写入BigQuery,但是最好将网络请求批处理成一组,比如说,每行10000行,这样就不会产生每行的网络开销 我一直在研究dask delayed,发现您可以创建任意计算图,但我不确定这是否是正确的方法:如何根据组大小(或可能经过的时间)收集并启动中间计算。有人能提供一个简单的例子吗?为了简单起见,我们有以下功能: def change_row(r): # Takes 10

我有一个大的(10s GB)CSV文件,我想将其加载到
dask
,并对每一行执行一些计算。我还想将被操纵的CSV的结果写入BigQuery,但是最好将网络请求批处理成一组,比如说,每行10000行,这样就不会产生每行的网络开销

我一直在研究
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)

谢谢

您可以做的最简单的事情是为提供块大小参数,这将使您获得每个块的大致正确行数。你可能需要测量你的一些数据或实验来获得正确的结果

任务的其余部分将以与任何其他“对数据帧块执行此通用操作”相同的方式工作:`map_partitions'方法()

基本上,您正在逻辑dask数据帧的每一部分上运行该函数,这是真实的数据帧。 实际上,您可能需要在函数中使用map、apply或其他数据帧方法


这是一种方法-您实际上不需要映射的“输出”,您可以使用
来代替延迟()

后续:是否有方法在
alter\u和
函数中获取分区号/索引?
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)