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