随着数据集和列数的增加,Spark作业的执行时间呈指数增长

时间:2018-09-15 09:02:27

标签: scala apache-spark bigdata

我在spark中创建了一个固定宽度的文件导入解析器,并对各种数据集执行了一些执行测试。 它最多可以处理1000列,但是,随着列数和固定宽度长度的增加,Spark作业性能会迅速下降。在20k列和固定宽度长度超过10万的列上执行需要花费大量时间。

可能的原因是什么?  如何提高性能?

我发现的类似问题之一:

http://apache-spark-developers-list.1001551.n3.nabble.com/Performance-Spark-DataFrame-is-slow-with-wide-data-Polynomial-complexity-on-the-number-of-columns-is-td24635.html

1 个答案:

答案 0 :(得分:0)

如果列数较多,最好将记录读取/转换为数组,并使用slice函数将其映射到各个列。使用子字符串获取单个列将不会那么有效。

编辑1:

我通过将Array [String]附加到scala中的案例类Record()来作为示例。您可以将其扩展到hdfs文本文件

scala> case class Record(a1:String,a2:Int,a3:java.time.LocalDate)
defined class Record

scala>  val x = sc.parallelize(Array("abcd1232018-01-01","defg4562018-02-01"))
x: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[3] at parallelize at <console>:24

scala> val y = x.map( a => Record( a.slice(0,4), a.slice(4,4+3).toInt,java.time.LocalDate.parse(a.slice(7,7+10))))
y: org.apache.spark.rdd.RDD[Record] = MapPartitionsRDD[4] at map at <console>:27

scala> y.collect()
res3: Array[Record] = Array(Record(abcd,123,2018-01-01), Record(defg,456,2018-02-01))

scala>