当我过滤数据集并且它们执行合并时,我担心在后台做什么火花(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)
,因此整个数据集无法在内存中分配。真的发生了吗?我可以避免吗?
谢谢!