由于工作中需要处理很大的数据文件,使用split命令将其切分成较小的文件后再进行处理是一个不错的选择。

在默认情况下,split以1000行为单位进行切分,如果不足1000行的会另外输出到一个文件。
输出文件由前缀和后缀组成,默认前缀为"x",默认后缀是从a开始带两个字符,如"aa"、"ab"等,当下一个生成的文件到达最后一个字符时,字符数量会加2,如:'yz', 'zaaa'...通过这种扩展方式,输出的文件数量没有限制。
但要注意:如果通过-a选项指定了后缀的长度,当后缀序列用完后split会报错,已经切分好的文件会保留。

我的split版本是8.22。支持的选项如下:

-l LINES 或者 --lines=LINES

将文件按 LINES 行切分到输出文件中。

orc stripe spark切分hybrid split 切分_后缀

 

orc stripe spark切分hybrid split 切分_后缀_02

 

-b SIZE 或者 --bytes=SIZE

将文件按指定的SIZE容量大小来切分到输出文件中
可以使用数值的形式或者单位的形式来表示
'MB' <==> 1000*1000
容量大小的相关含义:KB表示1000字节 K表示1024字节,其他容量单位类似。
切分后的文件中可能会存在不完整的行 到容量的分割点时,某一行可能还没有结束,会导致该行被切割成了两行或多行。

orc stripe spark切分hybrid split 切分_文件切分_03

 

但不用担心数据不完整,将顺序相邻的文件合并后(比如使用cat将两个文件内容拼到一起),不完整的行又会合并成一行。

orc stripe spark切分hybrid split 切分_后缀_04

 

-C 或者 --line-bytes=SIZE

跟-b都是按SIZE容量大小来切割,不同的是会以接近设置的最大容量切割,而不是一定是设置的容量。当行的大小不超过设置的容量时,会保证文件中每行内容的完整性,每个文件的容量会近似设置的最大容量。

orc stripe spark切分hybrid split 切分_linux_05

orc stripe spark切分hybrid split 切分_gnu_06

  

--filter=COMMAND

直接使用split也可以切分压缩文件,但是一般无法指定压缩文件的扩展名。
split -b200G test.xz big-
通过该选项,并结合FILE环境变量可以为每个切分后的压缩文件指定扩展名。
当有大的压缩文件要切分时,可以使用下面的命令
xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-
如果是1:10的压缩比,以上命令会将1T的文件切分成50个20G的文件,切分后的文件名类似:'big-aa.xz', 'big-ab.xz'

orc stripe spark切分hybrid split 切分_文件切分_07

orc stripe spark切分hybrid split 切分_linux_08

  

-n CHUNKS 或者 --number=CHUNKS

将文件切分成指定数量的文件,有3种模式:1、一般模式  2、l模式 3、r模式
块数(CHUNKS)的值可以设置为如下的形式:

          N      以当前INPUT的大小切分成N个文件
          K/N    仅将N个文件中的第K个输出到标准输出
          l/N    切分成N个文件,同时保证行不会被切断
          l/K/N  将N个文件中的第K个输出到标准输出,同时保证行不会被切断
          r/N    类似l模式,但使用轮询分配
          r/K/N  类似r/N,但仅将N个文件中的第K个输出到标准输出

(1)、一般模式下,将 INPUT 切分成 N 个块后剩余的字节,会分配给最后一个块。初始计算后input中再加入字节会被丢弃(除非使用r模式)。只要指定了N,即使INPUT少于N行或者INPUT中断,也始终会切分成N个文件。可能存在行被切断的情形。

orc stripe spark切分hybrid split 切分_后缀_09


(2)、在l模式下,块的大小约为INPUT大小/N,INPUT 会被分成 N 个相等大小的部分,最后分配剩余的。行不会被切断,最终的输出文件可能不会正好等于计算的切分大小;如果有的行非常长,有的块最终会是空的。 

orc stripe spark切分hybrid split 切分_后缀_10

(3)、在r模式下,会将文件行按块数挨个分配给相应的块。INPUT可以是任意大小,可直接用管道。

orc stripe spark切分hybrid split 切分_gnu_11

-a LENGTH 或者 --suffix-length=LENGTH

指定文件后缀名长度
如果LENGTH为0,则跟默认设定一致,长度2,且在必要时会自动将长度加2。

orc stripe spark切分hybrid split 切分_后缀_12

 

-d 或者 --numeric-suffixes[=FROM]

将后缀设置为数字而不是默认的小写字母。
如果指定FROM,则从FROM开始计数,否则从0开始。
需要注意,指定 FROM 值会禁用默认的自动后缀长度扩展,如果后缀值超过了“99”,需要指定“-a”选项。

orc stripe spark切分hybrid split 切分_文件切分_13

orc stripe spark切分hybrid split 切分_linux_14

  

--additional-suffix=SUFFIX

输出文件名后附加一个额外的SUFFIX(后缀)。利用该选项可以生成文件的扩展名。
注意:SUFFIX不能包含斜线。

orc stripe spark切分hybrid split 切分_gnu_15

orc stripe spark切分hybrid split 切分_split_16

   

orc stripe spark切分hybrid split 切分_后缀_17

orc stripe spark切分hybrid split 切分_split_18

-e 或者 --elide-empty-files

当指定--number选项时,如果文件行数比切分后的块数少,或者有非常长的行跨越了一个块都会造成生成空的(0长度)输出文件。指定该选项后,切分时不会生成空文件,且输出文件序列号也还是连续顺序生成的。

orc stripe spark切分hybrid split 切分_linux_19

orc stripe spark切分hybrid split 切分_文件切分_20

 

orc stripe spark切分hybrid split 切分_文件切分_21

  

-u 或者 --unbuffered

不使用缓冲,立即将输入复制到输出。在'--number r/...'模式下,不使用缓冲会慢很多。

orc stripe spark切分hybrid split 切分_文件切分_22

 

--verbose

切分前输出诊断信息

--version

显示版本信息