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

Scala Spark:搜索另一个数据帧的有效方法,scala,apache-spark,Scala,Apache Spark,我有一个带有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 i

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


非常感谢您的帮助

您希望进行非等联接,可以通过交叉联接然后过滤来实现,尽管这样做需要大量资源。假设您使用的是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)
如果您想包含null ip_int,您需要右键连接df以获得结果。

一个简单的连接应该可以满足您的要求

df.join(df1, df1("network_start_integer")<=df("ip_int") && df1("network_last_integer")>=df("ip_int"), "left")
    .select("ip", "ip_int", "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)
我希望答案是有用的

我在这里感到困惑

df1network\u start\u integer=dfip\u int

我们能用这个吗 df1network_start_integer==dfip_int)


请看这里?

我的代码总是出现内存限制超出错误,所以这让我可以更快地完成它?首先,您关心的是内存使用,而不是速度。这应该有效,并且比你拥有的更好。我也会考虑调整内存参数和增加内存。谢谢!它工作得很好!我不知道join可以这样使用join总是这样工作的:您尝试中的Seqip_int实际上是dfip_int==df1ip_int.:您如何在Pyspark shell中编写此函数?因为我的条件是network_start_integer