我在 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
如果您有更多列,最好将记录读取/转换为数组,并使用切片函数将其映射到各个列。使用子字符串来获取各个列的效率不会那么高。
EDIT 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)