RedShift 或 DynamoDb
Posted
技术标签:
【中文标题】RedShift 或 DynamoDb【英文标题】:RedShift or DynamoDb 【发布时间】:2020-02-21 03:36:19 【问题描述】:我有一个带有熊猫数据框的 python 项目,我需要一个数据库来扫描每个客户端的大行计数 现在在 mysql 中,数据库的查询需要很长时间才能执行,我需要新数据库系统的更好性能,但我现在不知道选择的最佳选择是什么:,因为我需要速度来执行大型查询从两个表中插入/删除/选择,我解释现在系统操作描述如下:
表:sales,sales_simulate,这个表不需要和其他表有关系,只有列client_id在开始处理时从数据文件源获取id,这个文件每个月导入来模拟数据
前提:该系统仅适用于 1 个在 vps 中运行的管理员,仅 1 个大型客户查询和销售每月模拟和更改值,我需要重新计算 3 年前的数据,仅此系统每月运行 1 次
问题: 获取 30k clients_id 查询 = ~8s 要获得每个客户的销售额 = ~4s 使用 python 处理(计算销售额等)take = 2m 删除/插入查询每 1k 个已处理的客户端 1kk 行占用 = ~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 行
【问题讨论】:
软件推荐请求在这里显然是无关紧要的——当我们允许它们时,商业软件供应商通过 sockpuppet 帐户提出虚假问题,以在回答中骗取他们的产品(而且,软件比较问题也被排除在外) -随着项目的变化、退休等快速约会——这使得它们对于努力成为常见问题解答的东西来说不是很好)。请参阅***.com/help/on-topic“一些问题仍然不在主题”列表中的#4 我不认为你想卖东西。我只是在解释为什么规则是这样的。 对于允许此问题 的备用 Stack Exchange 站点,请参阅 Software Recommendations - 但在该站点上,与所有其他站点一样,请在发布前阅读规则。 【参考方案1】:一般:
Amazon Redshift 是一个数据仓库。它擅长跨大表和数十亿行执行复杂的 SQL 查询。最适合用于查询,而不是作为事务存储。 (也就是说,数据应该批量加载,而不是一次更新几行。)
Amazon DynamoDB 作为一种非关系型数据库,在基于特定键更新和检索数据方面表现出色且性能卓越。但是,它不应该用于“扫描”所有存储的数据。 (使用二级索引根据非主键定位数据。)
因此,如果您不需要关系 (SQL) 查询并且您主要一次处理一行,那么 DynamoDB 是理想的选择。如果您必须跨多行搜索数据(例如使用WHERE
),那么关系数据库更为可取。
【讨论】:
以上是关于RedShift 或 DynamoDb的主要内容,如果未能解决你的问题,请参考以下文章
UNLOAD 命令是不是从 redshift 中删除或删除数据?
没有函数或存储过程的 Amazon RedShift 中的 Upsert