将标头记录(或字符串/文件)添加到 Scala / Java 中的大文件中
Posted
技术标签:
【中文标题】将标头记录(或字符串/文件)添加到 Scala / Java 中的大文件中【英文标题】:Prepend header record (or a string / a file) to large file in Scala / Java 【发布时间】:2018-11-20 01:09:14 【问题描述】:在 Scala 中将字符串或文件附加到另一个大文件的最有效(或推荐)方法是什么,最好不使用外部库?大文件可以是二进制的。
例如
如果前置字符串是:
header_information|123.45|xyz\n
大文件是:
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...
我希望得到:
header_information|123.45|xyz
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...
【问题讨论】:
为什么不是普通的unix? @erip 因为在这种情况下它将是解决方法,其次它不一定总是 unix 文件系统,它可以是 AWS S3 或其他东西。 【参考方案1】:我想出了以下解决方案:
-
将前置字符串/文件转换为 InputStream
将大文件转为 InputStream
使用 java.io 将 InputStreams“组合”在一起。SequenceInputStream
使用 java.nio.file.Files.copy 写入目标文件
object FileAppender
def main(args: Array[String]): Unit =
val stringToPrepend = new ByteArrayInputStream("header_information|123.45|xyz\n".getBytes)
val largeFile = new FileInputStream("big_file.dat")
Files.copy(
new SequenceInputStream(stringToPrepend, largeFile),
Paths.get("output_file.dat"),
StandardCopyOption.REPLACE_EXISTING
)
在约 30GB 文件上进行测试,在 MacBookPro (3.3GHz/16GB) 上耗时约 40 秒。
此方法可用于(如有必要)组合由例如创建的多个分区文件。火花引擎。
【讨论】:
以上是关于将标头记录(或字符串/文件)添加到 Scala / Java 中的大文件中的主要内容,如果未能解决你的问题,请参考以下文章
仅从 Spark Scala DataFrame 写入标头 CSV 记录
使用 Laravel 5.0 存储门面将元数据、标头(Expires、CacheControl)添加到上传到 Amazon S3 的文件中