我试图使用count()方法计算以下RDD元素。第一个如下:
scala> val data_wo_header=dropheader(data)
data_wo_header: org.apache.spark.rdd.RDD[String]
当我依靠这个时,我得到:
scala> data_wo_header.count()
res1: Long = 20000263
此操作相对较快,大约需要26秒
现在我按如下方式转换RDD:
scala> val ratings_split = data_wo_header.map(line => line.split(",")).persist()
ratings_split: org.apache.spark.rdd.RDD[Array[String]]
scala> ratings_split.count()
res2: Long = 20000263
此计数大约需要5分钟。有人可以建议为什么阅读计数的时间会大幅增加?
drop header
函数看起来只是为了删除第一行:
def dropheader(data: RDD[String]): RDD[String] = {
data.mapPartitionsWithIndex((idx, lines) => {
if (idx == 0) {
lines.drop(1)
}
lines
})
}
data
只是val data = sc.textFile(file, 2).cache()
答案 0 :(得分:1)
第二个显然更长,因为你不仅计算行数,还要将每行转换为字符串数组。
使用不带选项的persist()意味着它使用MEMORY_ONLY,因此与使用cache()完全相同。
现在5分钟看起来很昂贵,但这取决于你的配置(总内存,CPU),还取决于每行的元素数量。
正如Chobeat所说,你需要使用Spark UI进行调查。
答案 1 :(得分:0)
嗯,通过查看Spark UI并查看花费更多时间的阶段,您可以更轻松地进行验证。数据上的地图可能需要一些时间来遍历整个数据集并解释减速。另外persist()
可能会引入一些开销,但我不确定。
我的建议是,如果可以,请使用CSV数据源读取该CSV。