我正在设计一个使用Python、panda和Out-of-core工具进行库存交易分析的工具。这里会有一些大数据(2gb到200gb(,所以我使用Dask。
我的桌子有SKU, STORE, DATE_BY_DAY, SOLD_PRICE, ORDER_VOLUME, INVENTORY_LEVEL.
我使用的是镶木地板格式,按商店分区(如果我按sku分区,分区会变得太小(。
我想要具有非常低延迟的快速查询(主要是一些SKU和存储的聚合和过滤器(。问题是我必须马上做除此之外,我还必须根据当前库存(在另一张表上(计算每天的库存水平(INVENTORY_LEVEL
(,并按日期重新索引,因为源文件中可能缺少一些天数。
Dask不支持多索引,而且排序非常昂贵,所以做上面提到的计算会变得太难和太慢。
到目前为止我的选择和想法:
- 完全移动到Spark。(我目前正在使用dask(
- 移动到面向行的格式。(我目前正在使用Parquet(
- 以某种方式更改表模式,就像为
SOLD_PRICE
创建一个表,为ORDER_VOLUME
创建另一个表一样,这两个表都由SKU, STORE
索引,日期以列为中心 - 创建SKU和Store的串联,以减少索引层次结构
这些选项中的哪一个可以为我的项目带来性能增强?你能提出其他建议吗?
这里会有一些大数据(2gb到200gb(
200 GB不是大数据,但我会说"2到200"是2个数量级,不是一个很大的估计。
你能提出其他建议吗?
是:SQL。我还没有看到Pandas胜过SQLite,更不用说一个成熟的SQL DBMS了,数据集越大,SQL就做得越好。SQL还将为您提供更具表达力、更全面的语法,并减轻Pandas的一些乏味。
SQL是为"动态"查询而发明的。
我建议将您的数据加载到SQLite中。据猜测,你似乎只有一两张桌子。然后尝试一些查询,看看你是怎么做的。不要忽略你最喜欢的搜索和加入条件的索引。我想你可能会惊喜地发现,它计算inventory level
的速度如此之快,而你的努力却如此之少。
这并不是说你必须放弃Python。SQLite有两个Python库,其中一个用于大多数SQL引擎。您保留Python来处理UI工作,并让SQL处理数据。