Apache spark 为什么Spark Sql在一个操作的不同阶段读取同一文件两次?

Apache spark 为什么Spark Sql在一个操作的不同阶段读取同一文件两次?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,使用Spark sql代码,我正在Spark中读取一个1373 MB的csv文件,并将其转换为数据帧并创建多个临时表。每个临时表都是从上一个临时表派生的 当我使用spark submit执行spark应用程序时,我看到创建了一个作业,但当我进入阶段时,我看到两个阶段正在读取相同的输入文件。为什么会这样 我只有一个动作。为什么spark在不同阶段读取同一输入文件两次? 如您所见,在第0阶段和第2阶段中有11个任务以相同的输入文件大小执行 火花代码:这里只有部分代码 object Omeg

使用Spark sql代码,我正在Spark中读取一个1373 MB的csv文件,并将其转换为数据帧并创建多个临时表。每个临时表都是从上一个临时表派生的

当我使用spark submit执行spark应用程序时,我看到创建了一个作业,但当我进入阶段时,我看到两个阶段正在读取相同的输入文件。为什么会这样

我只有一个动作。为什么spark在不同阶段读取同一输入文件两次? 如您所见,在第0阶段和第2阶段中有11个任务以相同的输入文件大小执行

火花代码:这里只有部分代码

    object OmegaETL extends BaseETL {
            def main(args: Array[String]): Unit = {

             val omega_hdfs_input_loc ="/user/cloudera/data/inputfiles/Omega_events.csv"


             val sc                      = getSparkContext(jobName)
             val sqlContext              = getHiveContext(sc)
             val omegaRDD        = getBaseRDD(sc,omega_hdfs_input_loc)

             val OmegaoutputDF   = doOmegaProcess(sc,sqlContext,omegaRDD)

             OmegaoutputDF.registerTempTable("Omega_processed")
             sqlContext.sql("SELECT * FROM Omega_processed LIMIT 20 ").show(20)  
         }


          def doOmegaProcess(sc:SparkContext, sqlContext: HiveContext, OmegaRDD:RDD[Array[String]]): DataFrame = {
           import sqlContext.implicits._

             log.info("doOmegaProcess method started")
             val schemaRDD       = OmegaRDD.map(arr => new Omega(arr(0),arr(1),arr(2),arr(3),arr(4),
                                                      arr(5),arr(6),arr(7),arr(8),arr(9)))

             val OmegaDF        = schemaRDD.toDF()
             val Omega_filterDF = OmegaDF.filter($"scheme_name".isNotNull &&  length(trim($"scheme_name"))  > 0)
             Omega_filterDF.registerTempTable("Omega_filtered")
            //sqlContext.sql("SELECT * from Omega_filtered LIMIT 10").show(5)
             val latestEventDF   = getLatestEvent(sc,sqlContext,Omega_filterDF)// This line does further transformation on Omega_filterDF alone.
             latestEventDF.registerTempTable("Omega_latest_event")
             //sqlContext.sql("SELECT * from Omega_latest_event LIMIT 10").show(10)

             val OmegaoutputDF  = sqlContext.sql("""SELECT *

                                       |FROM Omega_filtered
                                       |WHERE TRIM(event_type) ='ACTION')Omega_events
                                       |INNER JOIN
                                       |Omega_latest_event
                                       |ON(Omega_events.data_id= Omega_latest_event.data_idAND Omega_events.conversion_base_type = Omega_latest_event.conversion_base_type)
                                       |""".stripMargin)// In this query I am applying union on two temp tables. Not including the whole query in question as it is big
             log.info("doOmegaProcess method ended")
              OmegaoutputDF
           }


       }

 class BaseETL {
 def getBaseRDD(sc:SparkContext,fileLoc:String):RDD[String]={
   sc.textFile(fileLoc)

  }
}
有人能帮我解释一下为什么spark会把同一个文件读两遍吗?如何克服这个问题


这是因为我正在创建多个临时表吗?

getBaseRDD的作用是什么?另外,当sparkContext在Omegard下面声明时,您如何传递它?这是复制粘贴问题。。GetBaseRDD为更新问题的文件创建父RDD