amazon-redshift - 快速将IP地址映射到城市
问题描述
我有一个包含 IP 地址列的事件表。我还有一个映射表,它采用 0 填充的 IP 地址范围并具有相应的城市、国家/地区。
我可以编写将 IP 地址转换为 0 填充的 IP 地址的查询,然后加入我的映射表。
但就性能而言,我什么也做不了。事件表有 40m+ 行,因此在我拔掉插头之前尝试基于字段操作的连接需要 30 分钟。我尝试映射一个映射表(IP 到 0 填充的 IP),但它并没有改进。即使是建立一个包含城市的唯一 IP 地址的简化表也需要很长时间。
我应该在这里采取一种方法或策略来尝试更有效地合并这些数据集吗?
解决方案
您不必每次都即时执行此操作。一个好的方法是实现。特别是因为您的数据可能是不可变的(IP 在记录后不会更改为行中的任何数据),您有更多选择。他们可以:
- 每晚运行一个脚本以重新运行整个连接
- 运行增量追加,因此每个新的数据部分,为进入源表的每个新数据部分追加连接
如果您有能力存储 40m+ 表的另一个副本,您可以将结果存储为一个新表,其中包含源表中的所有列加上县(可能还有 0 填充 IP),如果没有,您可以存储一个带有一些 ID 的表源表加上提供比原始查询更快的连接的连接结果。或者,如果源表是某个 ETL/ELT 过程的结果,这可能只是另一个步骤。
推荐阅读
- merge - 雪花:合并查询:期待 VARIANT 但列得到 VARCHAR(3038)
- python - 如何使用 Python 或机器人框架在打印预览页面上单击打印按钮
- python - 为“太空侵略者”制作子弹
- c# - 将日期添加到 ASP .NET Core 2.1 默认记录器
- c# - 我可以在 Visual Studio 命令行参数中使用用户的环境变量吗?
- javascript - 在 React.js 中更改组件的父级
- java - 如何将泛型带入 java 流
- python - 改变odoo 12中many2many字段的行为
- javascript - 如何在Javascript中获取作为列表给出的属性子集?
- docker - 在 Azure Pipelines 中每次成功构建时将图像推送到集线器时,如何管理 Docker Hub 上的图像?