PySpark中的慢速功能工程

Paw*_*wel 7 apache-spark pyspark apache-spark-ml feature-engineering

我正在尝试使用pyspark进行数据准备,其中涉及其他步骤,例如字符串索引,一种热编码和分位数离散化。我的数据框有很多列(1000列,其中包括500个间隔列,250个分类和250个二进制),位于100万行。

我的观察是,某些数据转换比其他数据转换要慢得多。如下摘要所示,某些步骤甚至可持续3个小时左右,而其他步骤仅需几分钟

步骤(执行时间):

  • 所有间隔变量的Log10转换(00:02:22)
  • 数据帧的随机数据分区(00:02:48)
  • 分位数的分位数离散化和向量组合(02:31:37
  • 一种针对分类的热编码和向量组合(03:13:51
  • 二进制文件的字符串索引和向量组装(03:17:34

似乎执行效果最差的步骤是字符串索引,一种热编码,分位数离散化或向量汇编。

您能否建议我应该检查或调整Spark配置或代码中的哪些内容以显着提高这些步骤的性能?

我使用了Pyspark.ml.feature中的上述功能工程步骤方法QuantileDiscretizer,VectorAssembler,OneHotEncoder,StringIndexer。我确定数据已完全上传到群集内存(persist(StorageLevel.MEMORY_ONLY))中。

我的集群包含7个节点(每个4核和16GB RAM)。Spark版本是2.2。使用Pyspark。

应用的Spark配置:

  • spark.serializer = org.apache.spark.serializer.KryoSerializer
  • spark.kryo.unsafe = true
  • spark.rdd.compress = false
  • 大师=纱线
  • 部署模式=集群
  • spark.driver.cores = 4
  • 驱动程序内存= 4G
  • num-executors = 6
  • 执行器内存= 10G
  • 执行者核心数= 4
  • spark.yarn.maxAppAttempts = 1
  • spark.sql.cbo.enabled = true
  • spark.sql.constraintPropagation.enabled = false