如何将sql通常会读取的大数据立即分块或分区到panda中



高级理念:

我需要对一个大型数据集(2.4亿行(进行迭代并执行相当复杂的操作,我已经将这些数据集分块到SQL调用中,每个调用返回约2000万条记录。我可以成功地将每个块拉到panda中,但这些数据帧很难处理,在我对它们进行操作之前,确实需要进一步的分块或分区。不幸的是,我无法将摄入调用划分得更小(SQL调用是通过Spectrum针对AWS S3的,如果是这样的话,将需要对未划分的列进行许多昂贵的扫描(。

使用Python,我如何在接收时有效地进一步分割这些大型数据集?

具体细节:

我有两个主要列来考虑IDDate。已经建立的区块(每个区块2000万(在Date列中存在数月。在每个摄入的区块中,我需要执行的操作看起来像:

  • Date对数据进行排序
  • 遍历每个ID,得到一个过滤到该ID的新数据集
  • 对于每个ID数据集中的每一行,做一些事情
  • 上述内容将允许我创建一个新的数据集,每个ID一行

。。。然后最终连接所有月份的结果。对我来说,推断是,如果我能立即用ID或类似的集合对每个摄入的2000万条记录进行分区,我就是黄金,但我不知道如何达到这一点。

我可以将每个ID集保存为一个单独的csv,但随后我需要对pandas数据帧进行迭代(过滤然后保存(,这是不可行的。我读过一些关于扩大熊猫规模的替代方案,比如大熊猫,但它呢?似乎?这并不能像我需要的那样真正处理摄取或设置一个大的for循环,而是典型的熊猫式数据转换。由于没有处理过如此大的数据,我不确定有什么工具可以在Python环境中处理这样的问题。

您没有给出最小的可复制示例,因此我无法处理您的特定数据。您可以使用生成器,但块实现起来更容易、更快,所以您走在了正确的轨道上。

我通常会大块这样的巨大数据集:

chunk_size = 10000
for i in range(0, len(column), chunk_size):
data_chunked = [j for j in column[i:i+chunk_size]] # or any other data manipulation
entries_to_sql = [data_chunked, *other_entries] # if others are not chunked: other_entry[i:i+chunk_size]
insert_many_entries_to_sql(entries_to_sql)

最新更新