使用itertuples按顺序读取分区

2024-03-29 00:18:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在中读取数据时,此时会发生这种情况(读取的行数应与当前索引匹配): 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)

在第11900000行之前,一切都是好的,此时它在错误的分区中切换。在


Tags: inforeadsqlindex排序顺序table读取数据
1条回答
网友
1楼 · 发布于 2024-03-29 00:18:10

这可能是问题的答案(这可能很少见),但是读取流的软件需要单调递增的索引。我只能假设以不同的速度解析对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函数调用(这很简单)

^{pr2}$

唯一的变化是ordered_partition的添加。我还没有完全测试过,所以一旦我对它满意,我会把它作为答案。在

相关问题 更多 >