Spark管道优化:在过滤的数据集上合并

时间:2017-01-19 09:01:45

标签: csv apache-spark out-of-memory pyspark

当我过滤数据集并且它们执行合并时,我担心在后台做什么火花(1.5.1)。我想生成一个包含我的数据集子集的CSV文件。为此,我执行:

df = sqlContext.read.parquet('...') # huge dataset
df_ids = sqlContext.read.parquet('...') # dataframe with the wanted IDs

df = df.join(df_ids, 'id', 'inner') # keep only rows with wanted ids from df
df = df.dropna().filter( df.Ti % 5 == 0 ) # only 2 in 10 rows

现在,如果我执行coalesce并保存为csv,则进程失败,因为它无法保留内存:

df.coalesce(1)\
  .write.format('com.databricks.spark.csv')\
  .mode('overwrite')\
  .option('header', 'true')\
  .save('/tmp/my.csv')

而不是那样,如果我保存数据帧然后加载它并进行合并,它就像魔术一样:

df.write.parquet('/tmp/df.parquet')
sqlContext.read.parquet('/tmp/df.parquet').coalesce(1)\
    .write.format('com.databricks.spark.csv')\
    .mode('overwrite')\
    .option('header', 'true')\
    .save('/tmp/my.csv')

在我看来,在任何其他操作之前,spark正在执行coalesce(1),因此整个数据集无法在内存中分配。真的发生了吗?我可以避免吗?

谢谢!

0 个答案:

没有答案