python - RedShift 或 DynamoDb
问题描述
我有一个带有熊猫数据框的python项目,我需要一个数据库来扫描每个客户端的大行数
现在在MySql中,数据库的查询需要很长时间才能执行我需要新的数据库系统有更好的性能,但我没有'现在选择的最佳选择是什么:RedShift 或 DynamoDb,因为我需要速度来从两个表中执行大型查询的插入/删除/选择,所以我在下面解释现在的系统操作描述:
表:sales,sales_simulate,这个表不需要和其他表有关系,只有列client_id在开始处理时从数据文件源获取id,这个文件每个月导入一次来模拟数据
前提:本系统仅适用于vps中运行的1个admin,每月仅1个客户和销售的大型查询模拟和更改值,并且需要重新计算3年前的数据,该系统每月仅运行1次
问题:
要获得 30k clients_id 查询 = ~8s
要获得每个客户的销售额 take = ~4s
使用 python 处理(计算销售额等) take = 2m
删除/插入查询每 1k 处理的客户 1kk 行的 take = ~12m
1k 客户 = ~14m
~14m * 30k 客户 = 420m / 60 = 7 小时 <- 总计
示例数据:
我有 30k 客户
我需要从 3 年前到现在当前日期为每个客户获取销售额
1 个客户有 4~10k 行销售登记,我有 30k 个客户:30k * 4k = 120k max 300k * 示例:
client_id | date | amount
1 2019-02-01 12:33:44 100.0
1 2019-02-01 12:34:44 100.0
1 2019-02-01 20:54:44 100.0
2 2019-02-01 08:54:44 62.0
2 2019-02-01 23:54:44 60.0
我得到日期结果的总量:
client_id | date | amount
1 2019-02-01 300.0
2 2019-02-01 122.0
现在使用 pandas 从日期前 3 年到现在日期为每个客户提供完整的数据框:
client_id | date | amount
1 2070-02-20 0
....
1 2019-02-01 300.0
...
1 2020-02-20 0
然后当用所有客户端的所有日期填充数据框时,我发送到数据库中保存每个客户端的 1.125k 行:1.125k * 30k(客户端)= 33,750,000 行
现在我尝试在数据部分保存,每处理 1000k 个客户端,我将行保存在表上,1.125k * 1k = 1,125,000 行
解决方案
一般来说:
Amazon Redshift是一个数据仓库。它擅长跨大表和数十亿行执行复杂的 SQL 查询。最适合用于查询,而不是作为事务存储。(也就是说,数据应该批量加载,而不是一次更新几行。)
Amazon DynamoDB是一个非关系型数据库,在基于特定键更新和检索数据方面表现出色且性能卓越。但是,它不应该用于“扫描”所有存储的数据。(使用二级索引根据非主键定位数据。)
因此,如果您不需要关系 (SQL) 查询并且您主要一次处理一行,那么 DynamoDB 是理想的选择。如果您必须跨多行搜索数据(例如使用WHERE
),那么关系数据库更为可取。