我是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")`
答案 0 :(得分:2)
我会尝试将其拆分,以查看问题所在
作为S3的工作目标,(a)提交速度慢,并且(b)由于S3的最终一致性,存在丢失数据的风险。除非您使用的是S3mper / S3Guard / EMR一致的EMRFS,否则不应将其用作直接的工作目标。