Dan*_*an 7 file-io scala apache-spark
据我所知的基本理论textFile生成每个文件分区,而wholeTextFiles产生一对值,其中关键是每个文件的路径的RDD,该值是每个文件的内容.
现在,从技术角度来看,有什么区别:
val textFile = sc.textFile("my/path/*.csv", 8)
textFile.getNumPartitions
Run Code Online (Sandbox Code Playgroud)
和
val textFile = sc.wholeTextFiles("my/path/*.csv",8)
textFile.getNumPartitions
Run Code Online (Sandbox Code Playgroud)
在这两种方法中,我生成了8个分区.那么我为什么要wholeTextFiles首先使用它,它有什么好处textFile呢?
Sha*_*ica 18
正如您所提到的,主要区别在于textFile返回一个RDD,每行作为一个元素,同时wholeTextFiles返回一个PairRDD,其中键是文件路径.如果不需要根据文件分离数据,只需使用textFile.
使用时读取未压缩的文件textFile,它会将数据拆分为32MB的块.从记忆的角度来看,这是有利的.这也意味着线路的排序会丢失,如果要保留订单则wholeTextFiles应该使用.
wholeTextFiles将立即读取文件的完整内容,它不会部分溢出到磁盘或部分垃圾收集.每个文件将由一个核心处理,每个文件的数据将是一台机器,使得分配负载更加困难.
Tza*_*har 16
textFile为每个文件生成分区,同时wholeTextFiles生成对值的RDD
这不准确:
textFile加载一个或多个文件,每行作为结果RDD中的记录.单个文件可能被分成几个分区,如果该文件是足够大(取决于分区的要求底层文件系统的数量,星火的默认分区的数量,和).当一次加载多个文件时,此操作"丢失"记录与包含它的文件之间的关系 - 即无法知道哪个文件包含哪一行.RDD中记录的顺序将遵循文件的字母顺序,以及文件中的记录顺序(顺序不会"丢失").
wholeTextFiles保存数据,并包含它,通过将数据加载到一个文件之间的关系,PairRDD与每个输入文件的一个记录.记录将有表格(fileName, fileContent).这意味着加载大型文件存在风险(可能导致性能不佳或OutOfMemoryError因为每个文件必然存储在单个节点上).分区是基于用户输入或Spark的配置完成的 - 多个文件可能加载到单个分区中.
一般来说,只textFile提供加载大量数据的常见用例(无论它如何分解为文件).readWholeFiles只有在您确实需要知道每条记录的原始文件名时才会使用,并且如果您知道所有文件都足够小的话.
| 归档时间: |
|
| 查看次数: |
13153 次 |
| 最近记录: |