我有一个带有一组IP地址的表列,我需要如下所述找出其区域/大陆。
------------------------------------------------------
ip_address | region
------------------------------------------------------
217.100.34.222 | North Holland
为此,我从ip2location.com下载了一个IP-corgion-region-city数据库,但其表格和值如下所示。
-----------------------------------------------------
ip_from | ip_to | country_code | country_name | region_name | city_name
-----------------------------------------------------
16777216 | 16777471 | AU | Australia | Queensland | Brisbane
我如何能够将ip_address
列转换为decimal number
,如IP2Location数据库中所示,并从中检索数据,还是有更好的方法来执行此过程以从ip address
中检索geo location
?
谢谢。
更好的方法来检索地理位置 从IP地址使用SparkSQL?
选项1 :
databricks在广告分析方面所述,这是一种方式。请查看完整的文章-An-ultrupted guide-to-Analytics.html
直接从Spark:
直接进行Web服务调用# Obtain the unique agents from the accesslog table
ipaddresses = sqlContext.sql("select distinct ip1 from
accesslog where ip1 is not null").rdd
# getCCA2: Obtains two letter country code based on IP address
def getCCA2(ip):
url = 'http://freegeoip.net/csv/' + ip
str = urllib2.urlopen(url).read()
return str.split(",")[1]
# Loop through distinct IP addresses and obtain two-letter country codes
mappedIPs = ipaddresses.map(lambda x: (x[0], getCCA2(x[0])))
可以通过查找以后扩展两个字母的国家代码
选项2 :Hive Table方法,例如带有Scala伪代码的示例(而不是Web服务方法。)
当您已经下载时,将数据摄取到蜂巢表中。
val ipsdf = hiveContext.sql(s"select ip from iptable ")
val countriesWithIp = hiveContext.sql(s"select countryname,ip from countriesWithIPs")
countriesWithIpAddrMapped = ipsdf.join(countriesWithIp , ipsdf("ip")===countriesWithIp("ip"), "inner" )
countriesWithIpAddrMapped.show();