Spark:搜索另一个数据帧的有效方法

时间:2017-08-02 23:39:58

标签: scala apache-spark

我有一个带有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合并。

非常感谢任何帮助!

3 个答案:

答案 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)

请到这里?