计算RDD [Array [String]]与RDD [String]

时间:2017-03-12 10:22:17

标签: scala apache-spark rdd

我试图使用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()

2 个答案:

答案 0 :(得分:1)

第二个显然更长,因为你不仅计算行数,还要将每行转换为字符串数组。

使用不带选项的persist()意味着它使用MEMORY_ONLY,因此与使用cache()完全相同。

现在5分钟看起来很昂贵,但这取决于你的配置(总内存,CPU),还取决于每行的元素数量。

正如Chobeat所说,你需要使用Spark UI进行调查。

答案 1 :(得分:0)

嗯,通过查看Spark UI并查看花费更多时间的阶段,您可以更轻松地进行验证。数据上的地图可能需要一些时间来遍历整个数据集并解释减速。另外persist()可能会引入一些开销,但我不确定。

我的建议是,如果可以,请使用CSV数据源读取该CSV。