将数据帧写入csv文件花费了太多时间来编写spark

时间:2017-03-03 07:49:04

标签: scala apache-spark apache-spark-sql

我想根据时间戳列上的间隔汇总数据。

我看到计算需要 53秒,但 5分钟将结果写入CSV文件。好像df.csv()写得太多了。

我该如何优化代码?

这是我的代码段:

val df = spark.read.option("header",true).option("inferSchema", "true").csv("C:\\dataSet.csv\\inputDataSet.csv")

//convert all column to numeric value in order to apply aggregation function 
df.columns.map { c  =>df.withColumn(c, col(c).cast("int")) }

//add a new column inluding the new timestamp column
val result2=df.withColumn("new_time",((unix_timestamp(col("_c0"))/300).cast("long") * 300).cast("timestamp")).drop("_c0")

val finalresult=result2.groupBy("new_time").agg(result2.drop("new_time").columns.map(mean(_)).head,result2.drop("new_time").columns.map(mean(_)).tail: _*).sort("new_time")

finalresult.coalesce(1).write.option("header", "true").csv("C:/result_with_time.csv")//<= it took to much to write

1 个答案:

答案 0 :(得分:1)

以下是基于您的代码进行优化的一些想法。

  1. inferSchema:拥有预定义的架构而不是使用inferSchema会更快。
  2. 您可以尝试在hdfs中编写,然后将文件scp到本地。而不是写入本地文件。
  3. df.coalesce(1).write将比df.write花费更多时间。但是你将获得多个文件,可以使用不同的技术进行组合。或者你可以让它在一个目录中,包含文件的多个部分。