优化连接两个spark scala数据帧的代码

优化连接两个spark scala数据帧的代码,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,新的火花。我想基于一个公共列连接两个数据帧 下面的代码片段我也在使用,但它占用了太多的时间。我如何优化相同的。请导游。我认为collect()造成了一个问题 test_df.collect().foreach(row => { val split_data = row.mkString(",").split(",") val tag = java.lang.Long.parseLong(split_data(1))

新的火花。我想基于一个公共列连接两个数据帧

下面的代码片段我也在使用,但它占用了太多的时间。我如何优化相同的。请导游。我认为collect()造成了一个问题

      test_df.collect().foreach(row => {
      val split_data = row.mkString(",").split(",")
      val tag = java.lang.Long.parseLong(split_data(1))

      val otherList = other_df.select(col("Tags")).filter(other_df("tag") === tag).map(_.getString(0)).collect.toList
      if (otherList.size > 1) {
        val lat = java.lang.Double.parseDouble(split_data(2))
        val long = java.lang.Double.parseDouble(split_data(3))
        tagname = getFinalTag(lat, long, otherList)
      } else if (otherList.size == 1) {
        tagname = otherList.head
      }

您好,这里有一些使用spark的建议:尽可能避免收集。收集会将所有数据带到一个节点,这会在网络中产生大量流量,如果您要进行一些处理,那么如果您没有足够的内存或cpu能力,则可能无法完成这些处理。。。如果您想连接两个数据帧,其中一个是小数据帧,则只需广播大小最小的数据帧,这样spark将在所有节点上复制它,这将减少混洗次数,并在网络上创建更少的流量(连接不同的群集节点),我建议您使用按键减少(而不是收集)通过选择要应用于数据的最佳函数。这是你的主要问题,否则在你的代码中你没有使用预定义的spark连接(除非我没有看到),如果你共享你的代码和你想要做的事情(你的逻辑),你可能会有一个更精确的答案。我希望它能对您有所帮助。

您在问题中的代码中在哪里进行连接?我想加入,但后来我使用了这个其他的_-df.select(col(“Tags”)).filter(other_-df(“tag”)==tag)。我有两个数据帧,我想在另一个数据帧中根据第一个数据帧的键找到一列(可以返回多行),如果它返回多行,则执行一些计算getFinalTag(lat、long、otherList)否则,如果它返回single,则返回该值并在第一个数据框中更新该值意味着添加该新值的列。您是否会共享test_df和另一个_df的模式?因为我没有看到模式,根据我的理解,这里是一个尝试,如果您共享我将帮助的模式:test_df=test_df.withColumn(“tag”,split(col(“second element”),“,”)(1).cast(DoubleType))val joinDF=test_df.join(other_df,test_df.col(“tag”)===other_df.col(“Tags”),“inner”).drop(“test_df.tag”)val myOutPut=joinDF.map(行=>//对数据进行处理)