繁体   English   中英

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

[英]Spark: efficient way to search another dataframe

我有一个带有IP地址及其对应的长值(ip_int)的数据框(df),现在我想在另一个包含地理位置信息的数据框(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合并在一起。

任何帮助深表感谢!

一个简单的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")

如果要删除空的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)

我希望答案是有帮助的

您想要进行非等额联接,可以通过交叉联接然后进行过滤来实现,尽管这样做很费资源。 假设您使用的是Spark 2.1:

df.createOrReplaceTempView("ip_int")
df.select("network_start_integer", "network_start_integer", "country_name").createOrReplaceTempView("ip_int_lookup")
// val spark: SparkSession
val result: DataFrame = spark.sql("select a.*, b.country_name from ip_int a, ip_int_lookup b where b.network_start_integer <= a.ip_int and b.network_last_integer >= a.ip_int)

如果要包含空ip_int,则需要右连接df才能得到结果。

我在这里感到困惑。

df1(“ network_start_integer”)<= df(“ ip_int”)&& df1(“ network_last_integer”)> = df(“ ip_int”)

我们可以使用df1(“ network_start_integer”)=== df(“ ip_int”)

请在这里?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM