Pyspark中的宽数据帧操作太慢

时间:2018-10-22 05:06:22

标签: python apache-spark pyspark

我是Spark的新手,正在尝试使用pyspark(Spark 2.2)对非常广泛的功能集(约1300万行,15,000列)执行过滤和聚合操作。功能集以拼花文件形式存储在S3驱动器上。我正在运行一个测试脚本,以将特征集加载到数据帧中,选择几千条记录,按特定区域代码分组,然后平均每个15k特征列。问题在于作业要么出错,要么花费的时间太长(对于5%的记录样本,大约需要8个小时)。

是否有任何方法可以在Pyspark的宽数据帧上加快此类操作?我正在使用Jupyter笔记本,希望这些查询能在几分钟而不是几小时内完成。

这是我的代码

df_feature_store = spark.read.parquet(PATH_FEATURE_STORE).sample(False, 0.05, seed=0).cache()
    logger.info("Initial data set loaded and sampled")

    df_selected_rors = spark.read.csv(PATH_DATA_SOURCE+"ROR Sample.csv", header=True)
    agg_cols = [x for x in df_feature_store.columns if re.search("^G\d{2}",x)]
    agg_cols = agg_cols[:10]  # just testing with fewer columns
    expr = {x:"mean" for x in agg_cols}
    joineddf = df_feature_store.join(df_selected_rors, df_feature_store.ROLLOUTREGION_IDENTIFIER == df_selected_rors.ROR, "inner")
    aggdf = joineddf.groupby("ROLLOUT_REGION_IDENTIFIER").agg(expr)
    # replace groupby
    # loop for a 1000 column aggregations 
    # transpose columns into rows as arrays
    aggdf.write.mode("overwrite").csv(PATH_FEATURE_STORE + "aggregated", header=True)
    logger.info("Done")`

1 个答案:

答案 0 :(得分:2)

我会尝试将其拆分,以查看问题所在

  • Spark的某些版本在DF中的许多列都有问题;我不记得具体了。
  • 在进行任何查询之前,先从CSV中读取并保存到本地Parquet中,并尽可能过滤掉列
  • 运行查询Parquet local-到Parquet local

作为S3的工作目标,(a)提交速度慢,并且(b)由于S3的最终一致性,存在丢失数据的风险。除非您使用的是S3mper / S3Guard / EMR一致的EMRFS,否则不应将其用作直接的工作目标。