小心Scala/Java的split函数

最近使用scala在spark上做开发,遇到一个怪异的问题,代码逻辑没问题,最终处理的数据居然不合逻辑。起初以为是spark的问题,最终排查后发现是scala的split函数的问题。

也不能说是scala的split函数有问题吧,它的split默认行为与其他语言不一样。

在python下:

a = '1,2,3,,,'.split(',')  
# a的值为['1', '2', '3', '', '', '']

在js下:

a = '1,2,3,,,'.split(',')  
# a的值为["1", "2", "3", "", "", ""]

其他语言就不一一举例了,在看看Scala的split的默认行为:

val a = "1,2,3,,,".split(',')  
# a的值为["1", "2", "3"]

这尼玛,如果后面的字符串都是空值,默认都给省掉了!这也是导致我的代码运行行为怪异的根本原因!

注意:这里Scala或Java只有分隔后后面的内容为空的情况下才会省略,中间的空内容是不会省略的,如下:

scala> "a,,,b,c".split(',')  
res3: Array[String] = Array(a, "", "", b, c)  

当然scala也提供了额外的参数,来保证split的行为和其他语言一致:

val a = "1,2,3,,,".split(",", -1)  
# a的值为["1", "2", "3", "", "", ""]

设置split的limit参数为-1,就可以正常的得到后面的空字符串了。

小心Scala的split函数!!他的默认行为有可能导致你的代码逻辑不正常!!

[参考]

http://stackoverflow.com/questions/29448343/spark-scala-split