我在多节点环境(一个主节点和两个从节点)上运行apache spark代码,我在其中操作数据帧然后对其执行逻辑回归。在此之间,我也在写出临时转换的文件。我目睹了一种特殊的观察(是的,我经过双重检查和三次检查),我无法解释,并且想要确认这是否可能是因为我的代码或者可能还有其他因素在起作用。
我有一个像
这样的数据框DF
uid rank text
a 1 najn
b 2 dak
c 1 kksa
c 3 alkw
b 1 bdsj
c 2 asma
我使用以下代码对其进行排序
sdf = df.orderBy("uid", "rank")
sdf.show()
uid rank text
a 1 najn
b 1 bdsj
b 2 dak
c 1 kksa
c 2 asma
c 3 alkw
使用
将转换后的df写入HDFSsdf.repartition(1)
.write.format("com.databricks.spark.csv")
.option("header", "true")
.save("/someLocation")
现在,当我再次尝试查看数据时,它似乎已经失去了排序
sdf.show()
uid rank text
a 1 najn
c 2 asma
b 2 dak
c 1 kksa
c 3 alkw
b 1 bdsj
当我跳过编写代码时,它工作正常。
任何人都有任何指示,如果这可能是一个有效的案例,我们可以采取一些措施来解决它。
P.S。我尝试了编写代码的各种变体,增加了分区数量,完全删除了分区并将其保存为其他格式。
答案 0 :(得分:0)
问题不是写入HDFS,而是写入评论中所述的重新分配零点。
如果您打算将所有内容写入单个文件,您应该这样做:
sdf.coalesce(1).orderBy(" uid"," rank")。write ...
coalesce避免了重新分区(它只是一个接一个地复制分区,而不是通过散列对所有内容进行洗牌)这意味着您的数据仍然会在原始分区内进行排序,因此更快地进行排序(当然,您总是可以丢失原始订购,因为它在这里没有多大帮助。)
请注意,由于您将所有内容都移到单个分区,因此无法扩展。如果你没有任何重新分区就会出错,你会根据sdf的原始分区数得到一些文件。每个文件都会在内部订购,因此您可以轻松地将它们组合在一起。