【问题标题】:Print data through Spark SQL taking long time通过 Spark SQL 打印数据需要很长时间
【发布时间】:2015-02-05 08:20:35
【问题描述】:

我在 hdfs 中有 3 个文本文件,我正在使用 spark sql 读取它们并将它们注册为表。之后,我做了将近 5-6 次操作——包括 joins 、 group by 等。整个过程几乎不需要 6-7 秒。 (源文件大小 - 3 GB,近 2000 万行)。 作为我计算的最后一步,我希望在我的最终 rdd 中只有 1 条记录——在下面的代码 sn-p 中命名为 acctNPIScr。

我的问题是,当我尝试通过注册为表并从表中打印记录或通过此方法打印此 rdd 时 - acctNPIScr.map(t => "Score: " + t(1)).collect ().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 

【问题讨论】:

    标签: sql apache-spark


    【解决方案1】:

    这里的关键是所有 Spark transformations 都是懒惰的。只有 actions 会导致对转换进行评估。

    // 这个时间几乎是 5 秒

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

    【讨论】:

    • 感谢您的回答。它确实澄清了我的疑问。
    • 如何在前面的步骤中进行一些转换。我可以在前面的步骤中使用什么样的转换,以便最后不会评估我的所有数据。缓存表是一个动作还是惰性操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多