我使用coalesce(1)将一个Dataframe写到单个文件中,像这样。
df.coalesce(1).write.format("csv")
.option("header", true).mode("overwrite").save(output_path)
快速浏览一下文件,就会发现顺序被保留了,但总是这样吗?如果顺序没有被保留,我怎么才能执行呢?RDD 的 coalesce 函数有一个额外的参数来禁止洗牌,但 Dataframe 的 coalesce 方法只需要一个参数。
如果你读取一个文件(sc.read.text
)的行文。DataFrame/Dataset/RDD
将按照它们在档案中的顺序。
list, map, filter,coalesce and flatMap
保留顺序。 sortBy, partitionBy and join
不保留顺序。
原因是,大多数 DataFrame/Dataset/RDD
操作工作在分区里面的Iterators上。所以map或者filter就是没有办法打乱顺序。
在如果你选择使用 HashPartitioner
并调用调用 map
关于 DataFrame/Dataset/RDD
将改变键。在这种情况下,您可以使用 partitionBy
来用洗牌的方式恢复分区。
我不这么认为,因为你怎么知道会发生凝聚 "到 "哪个节点?