我使用coalesce(1)将Dataframe写入单个文件,如下所示。
df.coalesce(1).write.format("csv") .option("header", true).mode("overwrite").save(output_path)
快速浏览一下文件就可以看出顺序是保留的,但总是这样吗?如果秩序得不到维护,我该如何执行?rdd的coalesce函数有一个额外的参数来禁止洗牌,但是dataframe的coalesce方法只需要一个参数。
sdnqo3pr1#
如果你读了一个文件( sc.read.text )这条线 DataFrame/Dataset/RDD 会按照他们在档案里的顺序。 list, map, filter,coalesce and flatMap 一定要保持秩序。 sortBy, partitionBy and join 不要维持秩序。原因是 DataFrame/Dataset/RDD 操作在分区内的迭代器上工作。所以Map或过滤器根本无法扰乱秩序。如果你选择使用 HashPartitioner 以及调用 map 在 DataFrame/Dataset/RDD 会换钥匙的。在这种情况下,您可以使用 partitionBy 用洗牌来恢复分区。
sc.read.text
DataFrame/Dataset/RDD
list, map, filter,coalesce and flatMap
sortBy, partitionBy and join
HashPartitioner
map
partitionBy
6rvt4ljy2#
我不这么认为,因为你怎么知道哪个节点的联合'到'将发生?
2条答案
按热度按时间sdnqo3pr1#
如果你读了一个文件(
sc.read.text
)这条线DataFrame/Dataset/RDD
会按照他们在档案里的顺序。list, map, filter,coalesce and flatMap
一定要保持秩序。sortBy, partitionBy and join
不要维持秩序。原因是
DataFrame/Dataset/RDD
操作在分区内的迭代器上工作。所以Map或过滤器根本无法扰乱秩序。如果你选择使用
HashPartitioner
以及调用map
在DataFrame/Dataset/RDD
会换钥匙的。在这种情况下,您可以使用partitionBy
用洗牌来恢复分区。6rvt4ljy2#
我不这么认为,因为你怎么知道哪个节点的联合'到'将发生?