将DataFrame保存到Parquet需要花费大量时间

时间:2016-12-01 05:59:18

标签: python apache-spark pyspark

我有一个火花数据框,大约有458MM行。它最初是一个RDD,然后我使用sqlcontext.createDataFrame

转换为spark数据帧

RDD的前几行如下:

sorted_rdd.take(5)
Out[25]:
[(353, 21, u'DLR_Where Dreams Come True Town Hall', 0, 0.896152913570404),
 (353, 2, u'DLR_Leading at a Higher Level', 1, 0.7186800241470337),
 (353,
  220,
  u'DLR_The Year of a Million Dreams Leadership Update',
  0,
  0.687175452709198),
 (353, 1, u'DLR_Challenging Conversations', 1, 0.6632049083709717),
 (353,
  0,
  u'DLR_10 Keys to Inspiring, Engaging, and Energizing Your People',
  1,
  0.647541344165802)]

我将其保存到数据框中,如下所示

sorted_df=sqlContext.createDataFrame(sorted_rdd,['user','itemId','itemName','Original','prediction'])

最后保存如下:

sorted_df.write.parquet("predictions_df.parquet") 

我使用Spark with Yarn有50个执行器,每个10g,5个核心。 write命令一直运行一小时,但文件仍未保存。

是什么让它变慢?

2 个答案:

答案 0 :(得分:1)

我可以考虑尝试两件事:

  1. 您可能需要检查所拥有的分区数。如果分区太少,则无法获得所需的并行性。

  2. Spark懒洋洋地做着它的东西。这意味着写入速度可能非常快,但计算速度很慢。您可以尝试做的是缓存数据帧(并执行一些操作,例如对其进行计数以确保其具体化),然后再次尝试写入。如果保存部分现在很快,那么问题在于计算而不是镶木地板。

答案 1 :(得分:0)

如果你有足够的话,

也会尝试增加核心,这是主要因素之一,因为数字核心与执行者的数量成正比。那么,并行处理成为可能。