我在spark中创建了一个固定宽度的文件导入解析器,并对各种数据集执行了一些执行测试。 它最多可以处理1000列,但是,随着列数和固定宽度长度的增加,Spark作业性能会迅速下降。在20k列和固定宽度长度超过10万的列上执行需要花费大量时间。
可能的原因是什么? 如何提高性能?
我发现的类似问题之一:
答案 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>