根据IP地址对大量帖子进行地理定位。 (880,000行)

时间:2018-10-18 12:28:15

标签: mysql sql r oracle

首先让我说我已经用尽了所有我可以自己提出的各种选择,然后研究了所有可见的死胡同。

我有一个典型的mysql论坛数据库,该数据库包括一个post表,该表约有880,000行。 post表中包含一列ip地址,我的最终目标是根据每个帖子的地理位置创建一个世界气泡图。如果我可以每月将它们分开,并创建过去8年中全世界发布频率的动画,那就更好了。

因为这是一个个人项目,并且IP地理位置的准确性并不重要,所以我不得不排除可以将IP批量转换为地理位置的付费API。我发现了关于stackoverflow的各种问题,这些问题链接到具有IP地理位置数据库的网站:https://dev.maxmind.com/geoip/geoip2/geolite2/

我最初的计划是将该数据库加载到论坛服务器上,并利用我在mysql上的经验创建一个新表,其中仅包含:postid,日期(以unix时间戳记),纬度,经度,城市,国家/地区。然后将此表导出到R,并生成我可能想要的所有地图和图表。但是,地理位置数据库在两个表之间的行数超过300万,而我死了的论坛却在一个简单的共享托管计划上,该计划不允许LOAD DATA。我尝试了这些问题中的所有解决方案,但没有运气: How to import CSV file to MySQL table access denied for load data infile in MySQL LOAD DATA INFILE within PHPmyadmin PHPMyAdmin saying: The used command is not allowed with this MySQL version

所以我的下一个想法是将帖子表中的相关列导出到.csv或.xml,然后将其上载到iacademy3.oracle.com的帐户中。但是,我对oracle没有经验,我知道的唯一方法是Data Workshop中的Data Load / Unload UI。 177MB XML文件上传失败,出现以下错误:

ORA-31011: XML parsing failed ORA-19202: Error occurred in XML processing LPX-00222: error received from SAX callback function


Error loading XML.
Return to application.

34MB .csv文件两次尝试上传失败,出现此错误:

Failure of Web Server bridge:
No backend server available for connection: timed out after 10 seconds or idempotent set to OFF or method not idempotent.

现在我没主意了。在逐个帖子的基础上,这是一个简单的查询,它可以查看帖子的IP,将其与地理位置数据库进行比较,并具有经度和纬度。但是当处理数百万行时,我不知道如何获得最终结果。

任何对新方法的建议或对我死胡同的帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

我们将生成一些IP地址,对它们进行地理位置定位并绘制它们:

library(iptools)
library(rgeolocate)
library(tidyverse)

生成一百万个(均匀分布的方式)随机IPv4地址:

ips <- ip_random(1000000)

然后,对它们定位:

system.time(
  rgeolocate::maxmind(
    ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
  ) -> xdf
)
##    user  system elapsed 
##   5.016   0.131   5.217 

5s(代表1m IPv4)。

现在由于均匀性,气泡将变得很小,所以仅在此示例中,我们将其四舍五入:

xdf %>% 
  mutate(
    longitude = (longitude %/% 5) * 5,
    latitude = (latitude %/% 5) * 5
  ) %>%  
  count(longitude, latitude) -> pts

然后绘制它们:

ggplot(pts) +
  geom_point(
    aes(longitude, latitude, size = n), 
    shape=21, fill = "steelblue", color = "white", stroke=0.25
  ) +
  ggalt::coord_proj("+proj=wintri") +
  ggthemes::theme_map() +
  theme(legend.justification = "center") +
  theme(legend.position = "bottom")

enter image description here

您可以看到我的意思是“太过统一”。但是,您拥有“真实的” IPv4,因此您应该使用gtg。

请考虑使用scale_size_area(),但老实说,请考虑完全不在地理地图上绘制IPv4。我从事互联网规模的研究,以谋生为目的,而准确性要求则有很多不足之处。出于这个原因,我很少低于国家/地区归因(我们为“真实”数据付费)。