Scala 在生产中对Spark行执行.getAs操作时发生异常。在当地效果很好

Scala 在生产中对Spark行执行.getAs操作时发生异常。在当地效果很好,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个通用代码,给定一组键,数据帧将在数据帧中找到该键集的副本 不起作用的代码: case class DuplicateRecord( datasetName: String, duplicateKeys: String, duplicateCount: Long ) def findDuplicatesInDF( spark: SparkSession inputName: String, inputDataFrame: DataFra

我有一个通用代码,给定一组键,数据帧将在数据帧中找到该键集的副本
不起作用的代码:

case class DuplicateRecord(
    datasetName: String,
    duplicateKeys: String,
    duplicateCount: Long
  )

def findDuplicatesInDF(
    spark: SparkSession
    inputName: String,
    inputDataFrame: DataFrame,
    groupColumns: Seq[String]): Dataset[DuplicateRecord] = {

    import spark.implicits._

    val keys = groupColumns.map(x => col(x))
    val idToCounts = inputDataFrame
      .groupBy(keys: _*)
      .agg(count(keys(0)).as("duplicateKeyCount"))

    idToCounts
      .filter(col("duplicateKeyCount") > 1)
      .map { idToCount =>
        DuplicateRecord(
          inputName,
          groupColumns.map(x => idToCount.getAs(x).toString).mkString(","),
          idToCount.getAs("duplicateKeyCount").toString.toLong)
      }
  }
上述代码在本地运行良好。然而,它在生产中失败了

 Error initializing SparkContext.
org.apache.spark.SparkException: A master URL must be set in your configuration
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:375)

我知道这与Spark以本地模式在单个JVM实例上运行有关。但是由于有多个执行器,并且数据在prod中被分区,导致了一种不确定的行为,spark无法理解从何处提取数据以完成操作。然而,我想了解确切的问题,并且在现有的与此相关的堆栈溢出问题中没有得到令人信服的答案。任何关于这方面的见解都会非常有用!谢谢

似乎错误出现在第一部分,请参见您的spark会话创建。@Lamanus:我不明白?会话在主函数中创建并传递给此函数。此外,这并不能解释为什么在我调整操作时代码会起作用。如果会话创建是一个问题,他们两个应该给我相同的关于spark会话的问题。
必须在您的配置中设置主URL
您在集群上没有主URL。@Lamanus:我认为spark配置不是问题。当两个代码都有相同的配置sparkSession的方法时,为什么最终工作的代码没有这个问题?我不知道,但错误表明了这一点。使用有限的代码和环境,我无法理解。似乎错误出现在第一部分,请参见您的spark会话创建。@Lamanus:我不明白?会话在主函数中创建并传递给此函数。此外,这并不能解释为什么在我调整操作时代码会起作用。如果会话创建是一个问题,他们两个应该给我相同的关于spark会话的问题。
必须在您的配置中设置主URL
您在集群上没有主URL。@Lamanus:我认为spark配置不是问题。当两个代码都有相同的配置sparkSession的方法时,为什么最终工作的代码没有这个问题?我不知道,但错误表明了这一点。我无法用有限的代码和env解决问题。
case class DuplicateRecord(
    datasetName: String,
    duplicateKeys: String,
    duplicateCount: Long
  )

case class IdToCounts(
    mergedKey: String,
    duplicateKeyCount: Long
  )

def findDuplicatesInDF(
    spark: SparkSession,
    inputName: String,
    inputDataFrame: DataFrame,
    groupColumns: Seq[String]): Dataset[DuplicateRecord] = {

    import spark.implicits._

    val keys = groupColumns.map(x => col(x))
    val idToCounts = inputDataFrame
      .withColumn("mergedKey", concat_ws(",", keys: _*))
      .groupBy(col("mergedKey"))
      .agg(count(col("mergedKey")).as("duplicateKeyCount"))
      .as[IdToCounts]

    idToCounts
      .filter(idToCount => idToCount.duplicateKeyCount > 1)
      .map { idToCount =>
        DuplicateRecord(inputName, idToCount.mergedKey, idToCount.duplicateKeyCount)
      }
  }