Dask - 使用itertuples按顺序读取分区

时间:2017-11-14 11:43:42

标签: python pandas dask

我使用Dask使用read_sql_table读取包含大约1400万行的表格。当我使用itertuples读取数据帧时,不会按顺序读取一个或两个分区的索引(在表中排序)。怎么可能强制执行这个? row_idrow_number生成(在视图上),并在生成数据帧时用作索引。我知道熊猫有一个sorted=True arg,类似的东西?

这是当前发生的事情,同时读取数据(读取的行数应与当前索引匹配): INFO - Read 11870000 Rows (index: 11870000) INFO - Read 11880000 Rows (index: 11880000) INFO - Read 11890000 Rows (index: 11890000) INFO - Read 11900000 Rows (index: 11900000) --INFO - Read 11910000 Rows (index: 12159912)-- INFO - Read 11920000 Rows (index: 12169912) INFO - Read 11930000 Rows (index: 12179912) INFO - Read 11940000 Rows (index: 12189912)

直到第11,900,000行,一切都很好,此时它会切换到错误的分区。

1 个答案:

答案 0 :(得分:0)

这可能是问题的答案(可能很少见),但读取流的软件需要单调递增的索引。我只能假设它是以不同速度解析的对DB的多次调用,因此可能另一种选择是在compute调用read_sql_table时使用单线程调度程序。 }。

首先,我得到每个分区中的第一个索引;

def _order_partitions(self, ddf):
    ordering = {}
    for partition in range(ddf.npartitions):
        ordering.update({partition: int(df.get_partition(partition).head(1).index[0])})

    return sorted(ordering, key=ordering.get)

将结果存储在self._ordered_partitions中,然后在Dask中重新创建itertuples函数调用(这非常简单);

def _generator(self):
    for i in range(self._ddf.npartitions):
        ordered_partition = self._ordered_partitions[i]
        df = self._ddf.get_partition(ordered_partition).compute()
        for row in df.itertuples():
            yield row

唯一的变化是添加了ordered_partition。我还没有完全测试过,所以一旦我对它感到满意就会标记为答案。