首先让我说我已经用尽了所有我可以自己提出的各种选择,然后研究了所有可见的死胡同。
我有一个典型的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,将其与地理位置数据库进行比较,并具有经度和纬度。但是当处理数百万行时,我不知道如何获得最终结果。
任何对新方法的建议或对我死胡同的帮助,将不胜感激。
答案 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")
您可以看到我的意思是“太过统一”。但是,您拥有“真实的” IPv4,因此您应该使用gtg。
请考虑使用scale_size_area()
,但老实说,请考虑完全不在地理地图上绘制IPv4。我从事互联网规模的研究,以谋生为目的,而准确性要求则有很多不足之处。出于这个原因,我很少低于国家/地区归因(我们为“真实”数据付费)。