读取有序文件时,Spark 是不是保留记录顺序?

Posted

技术标签:

【中文标题】读取有序文件时,Spark 是不是保留记录顺序?【英文标题】:Does Spark preserve record order when reading in ordered files?读取有序文件时,Spark 是否保留记录顺序? 【发布时间】:2017-08-22 15:55:55 【问题描述】:

我正在使用 Spark 读取记录(在本例中为 csv 文件)并处理它们。文件已经按某种顺序排列,但任何列都不会反映此顺序(将其视为时间序列,但没有任何时间戳列——每一行只是文件中的相对顺序)。我想在我的 Spark 处理中使用这个排序信息,来做一些事情,比如将一行与前一行进行比较。我不能明确地对记录进行排序,因为没有排序列。

Spark 是否保持从文件中读取记录的顺序?或者,有什么方法可以从 Spark 访问记录的文件顺序?

【问题讨论】:

【参考方案1】:

是的,当从文件读取时,Spark 会保持记录的顺序。但是当洗牌发生时,顺序不会被保留。因此,为了保留顺序,您需要进行编程以使数据中不会发生混洗,或者您创建一个序列。记录的数字并使用这些序列。处理时的数字。

在像 Spark 这样的分布式框架中,数据被划分为集群以进行快速处理,肯定会发生数据混洗。所以最好的解决方案是create a sequential numbers to each rows 并使用该序列号进行订购。

【讨论】:

读取一个大的HDFS文件有多个并行任务,导致多个分区,你怎么能指望有order的概念??好的,您可以“猜测”您正在处理第一个拆分(这使得可以在存在时跳过标题),但是对于顺序行编号,您会使用什么样的技巧...? 如果输入数据已经分区,那么它不可能像 hadoop 文件系统那样期望排序。在这种情况下,我们应该在将文件存储到 hdfs 之前设置序列号。 @RameshMaharjan 如果您从许多文件中读取数据集,然后每个文件都转到一个分区,我假设每个分区内都维护文件顺序,但是没有跨分区的顺序保证/ 文件? 那么答案正确与否?阅读内容第二条评论,顺便说一句。 @SamsonScharfrichter 所以我们的答案是否正确?我认为 zipwithindex 是诀窍,但是 ...【参考方案2】:

当数据被打乱时,顺序不会被保留。但是,您可以在进行计算之前枚举行。如果您使用的是 RDD,则有一个名为 zipWithIndex (RDD[T] => RDD[(T, Long)]) 的函数可以完全满足您的搜索需求。

【讨论】:

如果要读取多个CSV文件,则需要使用mappartitions和zipWithIndex。

以上是关于读取有序文件时,Spark 是不是保留记录顺序?的主要内容,如果未能解决你的问题,请参考以下文章

Spark s3 csv文件读取顺序

spark剖析:spark读取parquet文件会有多少个task

spark剖析:spark读取parquet文件会有多少个task

spark剖析:spark读取parquet文件会有多少个task

spark剖析:spark读取parquet文件会有多少个task

spark剖析:spark读取parquet文件会有多少个task