我有一个带有ip地址的数据帧(df)及其对应的长值(ip_int),现在我想搜索另一个包含地理位置信息的数据帧(ip2Country)来查找相应的国家名称。我应该如何在Scala中完成它。我的代码目前还没有解决:内存限制超过。
val ip_ints=df.select("ip_int").distinct.collect().flatMap(_.toSeq)
val df_list = ListBuffer[DataFrame]()
for(v <- ip_ints){
var ip_int=v.toString.toLong
df_list +=ip2Country.filter(($"network_start_integer"<=ip_int)&&($"network_last_integer">=ip_int)).select("country_name").withColumn("ip_int", lit(ip_int))
}
var df1 = df_list.reduce(_ union _)
df=df.join(df1,Seq("ip_int"),"left")
基本上我尝试迭代每个ip_int值并在ip2Country中搜索它们并将它们与df合并。
非常感谢任何帮助!
答案 0 :(得分:1)
一个简单的join
应该为你做的伎俩
df.join(df1, df1("network_start_integer")<=df("ip_int") && df1("network_last_integer")>=df("ip_int"), "left")
.select("ip", "ip_int", "country_name")
如果要删除null country_name,则可以添加过滤器
df.join(df1, df1("network_start_integer")<=df("ip_int") && df1("network_last_integer")>=df("ip_int"), "left")
.select("ip", "ip_int", "country_name")
.filter($"country_name".isNotNull)
我希望答案很有帮助
答案 1 :(得分:0)
你想做一个非equi连接,你可以通过交叉连接然后过滤来实现,尽管这样做会占用大量资源。假设您使用的是Spark 2.1:
.cancel(true)
如果要包含null ip_int,则需要将df加入到结果中。
答案 2 :(得分:0)
我在这里感到困惑。
df1(&#34; network_start_integer&#34;)&lt; = df(&#34; ip_int&#34;)&amp;&amp; DF1(&#34; network_last_integer&#34;)&GT; = DF(&#34; ip_int&#34)
我们可以使用吗? DF1(&#34; network_start_integer&#34)=== DF(&#34; ip_int&#34)
请到这里?