通过Spark SQL打印数据需要很长时间

时间:2015-02-04 19:47:09

标签: sql apache-spark

我在hdfs中有3个文本文件,我正在使用spark sql读取它们并将它们注册为表格。在那之后我做了近5-6次操作 - 包括连接,分组等等。整个过程几乎不需要6-7秒。 (源文件大小 - 3 GB,近20万行)。 作为我计算的最后一步,我期待在我的最终rdd中只有1条记录 - 在下面的代码片段中命名为acctNPIScr。

我的问题是,当我尝试通过注册表格并打印表格或此方法中的记录来打印此rdd时 - acctNPIScr.map(t =>"得分:" + T(1))。收集()。的foreach(的println)。这需要很长时间 - 打印1条记录差不多1.5分钟。

如果我在打印时出错了,有人可以帮助我。从schemardd打印最终结果的最佳方法是什么?

..... 
val acctNPIScr = sqlContext.sql(""SELECT party_id, sum(npi_int)/sum(device_priority_new) as  npi_score FROM AcctNPIScoreTemp group by party_id ") 
acctNPIScr.registerTempTable("AcctNPIScore")     

val endtime = System.currentTimeMillis() 
logger.info("Total sql Time :" + (endtime - st))   // this time is hardly 5 secs 

println("start printing") 

val result = sqlContext.sql("SELECT * FROM AcctNPIScore").collect().foreach(println) 

//acctNPIScr.map(t => "Score: " + t(1)).collect().foreach(println) 

logger.info("Total printing Time :" + (System.currentTimeMillis() - endtime)) // print one record is taking almost 1.5 minute 

1 个答案:

答案 0 :(得分:0)

他们的关键是所有Spark transformations都是懒惰的。只有actions才能评估转换。

  

//此时间不到5秒

这是因为您尚未强制进行转换评估。直到map(t => "Score: " + t(1)).collect()才会发生这种情况。 collect是一个操作,因此此时会处理整个数据集。